1. ホーム
  2. java

[解決済み] スイングラインボーダー片側太め

2022-02-15 02:17:40

質問

左側が顕著に太くなっています。Matte Borderを使ってもこのようにはなりません。私が知りたいのは、なぜLineBorderでこれができて、MatteBorderではできないのか、ということです。

これは、JButtonをJPanelに配置し、それをJFrameに追加しているところです。

関連するコード

package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;



public class View extends JPanel{ 

    public View(){
        JPanel displayPanel = new JPanel();
        displayPanel.setBackground(Color.WHITE);
        displayPanel.setSize(500, 500);

        JButton backspace = createButton("\u2190", "backspace", Color.RED, null, new Controller());

        backspace.setOpaque(false);
        backspace.setSize(25, 25);
        backspace.setBorder(new LineBorder(Color.RED, 1));
        backspace.setMinimumSize(new Dimension(25, 25));
        backspace.setPreferredSize(new Dimension(25, 25));

        displayPanel.add(backspace);

        add(displayPanel);
    }


   private JButton createButton (String text, String ac, Color fg, Color bg, ActionListener handler){
       JButton button = new JButton();
       button.setText(text);
       button.setForeground(fg);
       button.setBackground(bg);
       if (ac!= null){
           button.setActionCommand(ac);
       }
       button.setFont(new Font(button.getFont().getName(), button.getFont().getStyle(), 20));
       button.addActionListener(handler);
       return button;
   }

    private class Controller implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            String foo = e.getSource().toString();
            System.out.println(foo);
            //display.setText(button.getActionListeners().toString());

        }

    }

}

そしてメイン。

package test;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class Foo{
       public static void main (String args[]){
            final int height = 400;
            final int width =  330;
            Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
            EventQueue.invokeLater(new Runnable(){


        @Override
        public void run() {
         JFrame frame = new JFrame();
         frame.setSize(330, 400);

         frame.setLocation((screen.width - width )/2, (screen.height - height)/2);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setResizable(false);
         frame.setContentPane(new View());
         frame.setVisible(true);    
       }
      });   
     }
    }

に切り替えると

  backspace.setBorder(new MatteBorder(1, 1, 1, 1, Color.RED));

希望通りに表示されます。

LineBorderの太さの不一致は何が原因なのでしょうか?

解決方法は?

思いつきで、ビルドパスから1.8を削除し、同じライブラリを再び追加することにしました。ボタンがうまく描画されるようになりました。

これはEclipse Lunaでの話ですが、Lunaはビルドパスの癖があることで知られています(例えば、上記のトリックを同様に行わないとJavaFXが正しくインポートされないなど)。)