Почему цвет JPanel не меняется даже при нажатии кнопки? - PullRequest
0 голосов
/ 14 апреля 2020

Я делаю Head First Java, когда наткнулся на эту проблему, и я не знаю, как ее решить.

Я хочу изменить цвет моего JPanel виджета, когда кнопка нажал Я использую Ma c OS.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleGui implements ActionListener {
    JFrame frame;
    JButton button;

    public static void main(String[] args) {
        SimpleGui gui = new SimpleGui();
        gui.go();
    } //close main

    public void go() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button = new JButton("changes colour");
        button.addActionListener(this);

        MyPanel drawPanel = new MyPanel();

        frame.getContentPane().add(BorderLayout.SOUTH,button);
        frame.getContentPane().add(BorderLayout.CENTER,drawPanel);

        frame.setSize(300, 300);
        frame.setVisible(true);
   } //close go


    public void actionPerformed(ActionEvent event) {
        frame.repaint();
        button.setText("color changed");
    }
} // close actionPerformed

// the widget whose color i want to change 
class MyPanel extends JPanel {

    public void paintComponent(Graphics g) {
        g.setColor(Color.green); // i choose green as a color 
        g.fillRect(20, 50, 100, 100);
    } //close paintComponent
} //close MyPanel

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

но вдова JFrame имеет зеленый прямоугольник еще до того, как я нажму на кнопку.

Это потому, что вы уже жестко задали зеленый цвет в методе paintComponent. Поэтому он всегда будет зеленым.

У вашего класса должно быть свойство устанавливать цвет прямоугольника. Что-то вроде:

class MyPanel extends JPanel 
{
    private Color rectangleColor = getBackground();

    @Override
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);

        g.setColor( rectangleColor); // i choose green as a color 
        g.fillRect(20, 50, 100, 100);
    }

    public void setRectangleColor(Color rectangleColor)
    {
        this.rectangleColor = rectangleColor;
        repaint();
    }
} 

Затем в ActionListener используемой вами кнопки:

//frame.repaint();
drawPanel.setRectangleColor( Color.GREEN );
button.setText("color changed");

Переменная 'drawPanel` также должна быть переменной экземпляра в вашем классе.

Теперь с этим дизайном вы можете иметь несколько кнопок. Каждая кнопка может изменить прямоугольник на свой цвет.

1 голос
/ 14 апреля 2020
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleGui implements ActionListener {
JFrame frame;
JButton button;

public static void main(String[] args) {
    SimpleGui gui = new SimpleGui();
    gui.go();
} //close main

public void go() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    button = new JButton("changes colour");
    button.addActionListener(this);

    MyPanel drawPanel = new MyPanel();

    frame.getContentPane().add(BorderLayout.SOUTH,button);
    frame.getContentPane().add(BorderLayout.CENTER,drawPanel);

    frame.setSize(300, 300);
    frame.setVisible(true);
   } //close go


@Override
public void actionPerformed(ActionEvent event) {
    frame.repaint();
    button.setText("color changed");
}
} // close actionPerformed

// the widget whose color i want to change 
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    this.setBackground(Color.white);
    g.setColor(Color.green); // i choose green as a color 
    g.fillRect(20, 50, 100, 100);
} //close paintComponent
} //close MyPanel

paintCompenent должно быть paintComponent

...