我的Main类中有两个侦听器,labelButton侦听器更改JLabel中的文本,另一个colourButton更改圆形内的颜色。出于某种原因,当我点击labelButton时,它也会设置colourButton,但它只会在第一次点击时执行此操作。我只想让它改变JLabel中的文本!
public class Main {
JFrame jframe;
JLabel label;
public static void main(String[] args) {
Main main = new Main();
main.go();
}
public void go() {
jframe = new JFrame();
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton labelButton = new JButton("Change Label");
labelButton.addActionListener(new LabelListener());
JButton colourButton = new JButton("Change colours!");
colourButton.addActionListener(new ColourListener());
label = new JLabel("I'm a label");
MyComponent component = new MyComponent();
jframe.getContentPane().add(BorderLayout.SOUTH, colourButton);
jframe.getContentPane().add(BorderLayout.CENTER, component);
jframe.getContentPane().add(BorderLayout.EAST, labelButton);
jframe.getContentPane().add(BorderLayout.WEST, label);
jframe.setSize(400,400);
jframe.setVisible(true);
}
class LabelListener implements ActionListener {
int i = 0;
@Override
public void actionPerformed(ActionEvent e) {
label.setText("Ouch! " + i++);
}
}
class ColourListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
jframe.repaint();
}
}
}
组件
public class MyComponent extends JPanel{
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
Graphics2D g2d = (Graphics2D) g;
int red = (int) (Math.random() * 256);
int green = (int) (Math.random() * 256);
int blue = (int) (Math.random() * 256);
Color colour = new Color(red,green,blue);
red = (int) (Math.random() * 256);
green = (int) (Math.random() * 256);
blue = (int) (Math.random() * 256);
Color endColour = new Color(red,green,blue);
GradientPaint gradient = new GradientPaint(70,70,colour,150,150,endColour);
g2d.setPaint(gradient);
g2d.fillOval(70, 70, 100, 100);
}
}
答案 0 :(得分:1)
这是由于标签更改的副作用。
当标签长度发生变化时,需要重新定位组件并重新进行重新绘制。它建议您不要更改paint
方法中的颜色,而是在动作侦听器中更改它。
答案 1 :(得分:1)
标签的更改,因为它是透明的,将导致父容器重新绘制,以消除任何图形工件的可能性。
因为paintComponent
方法将颜色随机化,这意味着无论何时重新绘制颜色,颜色都会发生变化。
这是一个很好的例子,说明了如何控制绘制过程以及绘制方法为什么只绘制组件的CURRENT状态。
将颜色随机化移至另一种方法,然后从actionListener
调用该方法,该方法也会调用repaint
本身