GridLayout панель с кнопками и JRadioButton на второй панели проблема - PullRequest
0 голосов
/ 30 августа 2018

У меня проблема с JRadioButton, JCheckBox и другими подобными компонентами. У меня есть панель с 9 кнопками и вторая панель с группой JRadioButtons. Когда я наводю курсор мыши на JRadioButton или выбираю один, он появляется на второй кнопочной панели. Я искал ответ, но явно не знаю, как назвать свою проблему.

Код кадра:

JFrame frame = new JFrame("TicTacToe");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel buttonPane = new JPanel(new GridLayout(3,3));
    PlayButton b1 = new PlayButton();
    buttonPane.add(b1);
    PlayButton b2 = new PlayButton();
    buttonPane.add(b2);
    PlayButton b3 = new PlayButton();
    buttonPane.add(b3);
    PlayButton b4 = new PlayButton();
    buttonPane.add(b4);
    PlayButton b5 = new PlayButton();
    buttonPane.add(b5);
    PlayButton b6 = new PlayButton();
    buttonPane.add(b6);
    PlayButton b7 = new PlayButton();
    buttonPane.add(b7);
    PlayButton b8 = new PlayButton();
    buttonPane.add(b8);
    PlayButton b9 = new PlayButton();
    buttonPane.add(b9);

    JPanel chosePane = new JPanel(new GridLayout(3,1));
    frame.add(chosePane, BorderLayout.EAST);
    chosePane.add(new JLabel("Chose symbol which starts game:  "));
    ButtonGroup group = new ButtonGroup();
    JRadioButton rb1 = new JRadioButton("First");
    JRadioButton rb2 = new JRadioButton("Second");
    group.add(rb1);
    group.add(rb2);
    chosePane.add(rb1);
    chosePane.add(rb2);
    frame.add(buttonPane, BorderLayout.WEST);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

и код кнопки:

public class PlayButton extends JButton

 public PlayButton()
{
    this.setPreferredSize(new Dimension(100,100));
    //this.setBorder();
    repaint();
}

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(new BasicStroke(5));
    g2.drawLine(4,4,95,95);
    g2.drawLine(4,95,95,4);
    g2.setStroke(new BasicStroke(1));


}

enter image description here

1 Ответ

0 голосов
/ 30 августа 2018
public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(new BasicStroke(5));
    g2.drawLine(4,4,95,95);
    g2.drawLine(4,95,95,4);
    g2.setStroke(new BasicStroke(1));
}

Когда вы делаете пользовательскую живопись, вам нужно вызвать

super.paintComponent(g);

в качестве первого утверждения в методе, обеспечивающего очистку фона, в противном случае артефакты рисования можно оставить.

Конечно, если вы сделаете это, вы получите изображение по умолчанию для JButton. Так, может быть, вам нужно расширить JComponent для вашей пользовательской картины?

Кроме того, не вызывайте repaint () в конструкторе вашего класса:

  1. ничего не делает, потому что компонент не был добавлен в видимую рамку
  2. Swing определит, когда необходимо перекрасить компонент, поэтому вы редко будете вызывать этот метод, если вы не делаете что-то вроде анимации и вам не нужен компонент для перекраски.

Edit:

Похоже, вы просто пытаетесь нарисовать "X" на кнопке. Вы действительно не должны расширять JButton для чего-то подобного. Вы должны расширять компонент только при добавлении новых функций.

A JButton уже поддерживает отображение Icon, так что вы действительно хотите просто создать Icon, который вы можете использовать на кнопке:

BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = bi.createGraphics();
g2.setColor( Color.BLACK );
g2.setStroke(new BasicStroke(5));
g2.drawLine(4,4,95,95);
g2.drawLine(4,95,95,4);
ImageIcon icon = new ImageIcon( bi );

Теперь Icon можно использовать на любом компоненте, который поддерживает отображение Icon:

JButton button = new JButton( icon );
button.setFocusPainted( false );
button.setBorder( null );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...