JAVA swing gui window 在重绘方法 运行 后变得不和谐
JAVA swing gui window gets jarred after repaint method is run
我开始学习 Java Swing。我试图创建一个 GUI,其中有 2 个按钮,底部的 changeColor
和右侧的 changeLabel
。它在右侧和中心有一个标签 JPanel
,显示渐变色的椭圆形。
当我点击 changeLabel
时,它工作正常并更改了左侧的标签。但是当我点击 changeColor
时,出现了一个新的椭圆形,整个布局被打破,一些新的面板叠加在一起。我正在关注一本书,其中给出了相同的东西,但是它在 paintComponent
方法中使用了随机颜色生成,我从这里学到的,这不是一件好事。该方法工作正常,但我试图避免这种情况并制作一个单独的方法。但这不起作用。
图形界面 class:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TwoButtons {
public JFrame frame;
private JLabel label;
private MyDrawPanel panel;
private boolean clicked = false;
public static void main(String[] args) {
TwoButtons gui = new TwoButtons();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton labelButton = new JButton("Change Label");
labelButton.addActionListener(new LabelListener());
JButton colorButton = new JButton("Change color");
colorButton.addActionListener(new ColorListener());
label = new JLabel("I'm a label");
panel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.setSize(300, 300);
frame.setVisible(true);
}
class LabelListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (!clicked) {
label.setText("Ouch!! (Click again to revert)");
clicked = true;
} else {
clicked = false;
label.setText("Change Label");
}
}
}
class ColorListener implements ActionListener {
@Override//
public void actionPerformed(ActionEvent e) {
//frame.repaint();
panel.changeColors();
}
}
}
填色class:
import javax.swing.*;
import java.awt.*;
public class MyDrawPanel extends JPanel{
private Color startColor,endColor;
public MyDrawPanel(){
this.changeColors();
}
public void paintComponent(Graphics g){
Graphics2D g2D=(Graphics2D)g;
GradientPaint gradient=new GradientPaint(70,70,startColor,150,150,endColor);
g2D.setPaint(gradient);
g2D.fillOval(70,70,100,100);
}
public void changeColors(){
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
startColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
endColor = new Color(red, green, blue);
this.repaint();
}
}
点击前改变颜色
点击后更改颜色
为了避免渲染瑕疵:
public void paintComponent(Graphics g){ ..
应该是:
public void paintComponent(Graphics g){
super.paintComponent(g); ..
调用super
方法,会自动重新绘制背景、边框等,从而擦除之前的绘制。
我开始学习 Java Swing。我试图创建一个 GUI,其中有 2 个按钮,底部的 changeColor
和右侧的 changeLabel
。它在右侧和中心有一个标签 JPanel
,显示渐变色的椭圆形。
当我点击 changeLabel
时,它工作正常并更改了左侧的标签。但是当我点击 changeColor
时,出现了一个新的椭圆形,整个布局被打破,一些新的面板叠加在一起。我正在关注一本书,其中给出了相同的东西,但是它在 paintComponent
方法中使用了随机颜色生成,我从这里学到的,这不是一件好事。该方法工作正常,但我试图避免这种情况并制作一个单独的方法。但这不起作用。
图形界面 class:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TwoButtons {
public JFrame frame;
private JLabel label;
private MyDrawPanel panel;
private boolean clicked = false;
public static void main(String[] args) {
TwoButtons gui = new TwoButtons();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton labelButton = new JButton("Change Label");
labelButton.addActionListener(new LabelListener());
JButton colorButton = new JButton("Change color");
colorButton.addActionListener(new ColorListener());
label = new JLabel("I'm a label");
panel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.setSize(300, 300);
frame.setVisible(true);
}
class LabelListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (!clicked) {
label.setText("Ouch!! (Click again to revert)");
clicked = true;
} else {
clicked = false;
label.setText("Change Label");
}
}
}
class ColorListener implements ActionListener {
@Override//
public void actionPerformed(ActionEvent e) {
//frame.repaint();
panel.changeColors();
}
}
}
填色class:
import javax.swing.*;
import java.awt.*;
public class MyDrawPanel extends JPanel{
private Color startColor,endColor;
public MyDrawPanel(){
this.changeColors();
}
public void paintComponent(Graphics g){
Graphics2D g2D=(Graphics2D)g;
GradientPaint gradient=new GradientPaint(70,70,startColor,150,150,endColor);
g2D.setPaint(gradient);
g2D.fillOval(70,70,100,100);
}
public void changeColors(){
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
startColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
endColor = new Color(red, green, blue);
this.repaint();
}
}
点击前改变颜色
点击后更改颜色
为了避免渲染瑕疵:
public void paintComponent(Graphics g){ ..
应该是:
public void paintComponent(Graphics g){
super.paintComponent(g); ..
调用super
方法,会自动重新绘制背景、边框等,从而擦除之前的绘制。