使用2个JPanel时Swing Java重新绘制不起作用
正如您从代码中看到的,我希望在DrawingPanel上看到一个矩形,但我不确定为什么repaint()方法不起作用。任何帮助都将不胜感激。我还尝试了重新验证方法,但也不起作用 以下是我的课程:使用2个JPanel时Swing Java重新绘制不起作用,java,swing,3d,awt,graphics2d,Java,Swing,3d,Awt,Graphics2d,正如您从代码中看到的,我希望在DrawingPanel上看到一个矩形,但我不确定为什么repaint()方法不起作用。任何帮助都将不胜感激。我还尝试了重新验证方法,但也不起作用 以下是我的课程: import javax.swing.*; import java.awt.*; public class Designer extends JFrame { static JFrame f = new Designer(); JSplitPane splitPane = new JSplitPa
import javax.swing.*;
import java.awt.*;
public class Designer extends JFrame {
static JFrame f = new Designer();
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
DrawingPanel drawingPanel = new DrawingPanel();
PropertyPanel propertyPanel = new PropertyPanel();
public Designer(){
Rectangle bounds = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getMaximumWindowBounds();
splitPane.setTopComponent(propertyPanel);
splitPane.setBottomComponent(drawingPanel);
add(splitPane, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(bounds);
setVisible(true);
}
public static void main(String[] args) {
System.out.println("App started...");
}
}
第一个Jpanel的类:PropertyPanel.Java
import javax.swing.*;
import java.awt.event.*;
public class PropertyPanel extends JPanel {
private DrawingPanel drawingPanel = new DrawingPanel();
public PropertyPanel(){
JButton addShapesBtn = new JButton("Add");
addShapesBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawingPanel.addRectangle();
}
});
add(addShapesBtn);
}
}
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class DrawingPanel extends JPanel{
private List<Rectangle> squares = new ArrayList<Rectangle>();
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
System.out.println("painting");
for (Rectangle rect : squares) {
g2.draw(rect);
}
}
public void addRectangle() {
Rectangle rectx = new Rectangle(10, 10, 100, 100);
squares.add(rectx);
repaint(); <-- this is not working
}
}
第二个Jpanel的类:DrawingPanel.Java
import javax.swing.*;
import java.awt.event.*;
public class PropertyPanel extends JPanel {
private DrawingPanel drawingPanel = new DrawingPanel();
public PropertyPanel(){
JButton addShapesBtn = new JButton("Add");
addShapesBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawingPanel.addRectangle();
}
});
add(addShapesBtn);
}
}
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class DrawingPanel extends JPanel{
private List<Rectangle> squares = new ArrayList<Rectangle>();
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
System.out.println("painting");
for (Rectangle rect : squares) {
g2.draw(rect);
}
}
public void addRectangle() {
Rectangle rectx = new Rectangle(10, 10, 100, 100);
squares.add(rectx);
repaint(); <-- this is not working
}
}
import javax.swing.*;
导入java.awt.*;
导入java.util.ArrayList;
导入java.util.List;
公共类DrawingPanel扩展了JPanel{
私有列表方块=新的ArrayList();
@凌驾
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
系统输出打印(“绘制”);
用于(矩形矩形:正方形){
g2.绘制(rect);
}
}
公共void addRectangle(){
矩形rectx=新矩形(10,10,100,100);
正方形。添加(rectx);
重新绘制();您的重新绘制工作正常。您的问题是,您正在调用addRectangle()
到错误的DrawingPanel实例,而不是当前显示在GUI中的实例。要解决此问题,请将显示实例的引用传递到需要调用该方法的代码
要查看这一点是否正确,只需在此页面中搜索new DrawingPanel()
。您应该在自己的代码(以及发布的代码)中只看到一次。您看到它两次,这意味着您已经创建了两个实例
e、 例如,改变这一点:
public class PropertyPanel extends JPanel {
private DrawingPanel drawingPanel = new DrawingPanel();
public PropertyPanel(){
为此:
public class PropertyPanel extends JPanel {
private DrawingPanel drawingPanel; // don't create new
public PropertyPanel(DrawingPanel drawingPanel){
this.drawingPanel = drawingPanel;
然后在创建时将true DrawingPanel传入此对象:
DrawingPanel drawingPanel = new DrawingPanel();
PropertyPanel propertyPanel = new PropertyPanel(drawingPanel);
更好的方法是:以M-V-C的方式构造代码,并使用依赖项注入来建立连接——但这对于您的简单GUI来说可能有些过分。非常感谢。这确实很有帮助。@VK321:不客气,但它有意义吗?另外,请参阅编辑以回答问题。