gpt4 book ai didi

java - Swing 应用程序未在 JPanel 内绘制 JComponent

转载 作者:行者123 更新时间:2023-12-02 05:57:54 25 4
gpt4 key购买 nike

我目前正在编写一个 Java 绘画程序,使用 Swing 库和 Graphics2D 进行绘画。我的主 GUI 类扩展了 JComponent,我试图将其放入 JPanel 中,并将 JPanel 放入 JFrame 中,以便将其显示在屏幕上。但启动程序时,JComponent 看起来只是一条黑线(边框,设置为组件周围的黑线)。我不明白为什么会发生这种情况,我已经调试了几个小时。如果有人能发现这个程序中的错误,我会很高兴。提前致谢。

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

public class PaintGUI extends JComponent {

private static final long serialVersionUID = 1L;

JButton red, green, blue, clear;
Image img;
Graphics2D gfx;
JFrame drawFrame;
JPanel btnPan, drawPan;
MyListener ml;
Action act;
int x, y, prevX, prevY;

public PaintGUI(){
//Initialisering av panel, frame og content
drawFrame = new JFrame("IFIPaint");
drawFrame.setLayout(new BorderLayout());
btnPan = new JPanel();
drawPan = new JPanel();
btnPan.setLayout(new FlowLayout());
drawPan.setLayout(new BorderLayout());
this.setEnabled(true);

//Setter størrelser
btnPan.setPreferredSize(new Dimension(30, 60));
btnPan.setMinimumSize(new Dimension(30, 60));
btnPan.setMaximumSize(new Dimension(30, 60));

//Ordner knappene
red = new JButton("Rød");
green = new JButton("Grønn");
blue = new JButton("Blå");
clear = new JButton("Slett alt");

//Putter knappene på panelet
btnPan.add(red);
btnPan.add(green);
btnPan.add(blue);
btnPan.add(clear);

//Legger på action listeners
act = new Action();
red.addActionListener(act);
green.addActionListener(act);
blue.addActionListener(act);
clear.addActionListener(act);

//Fullfører vindu og setter synlighet
drawFrame.setSize(500, 500);
drawPan.setBounds(0, 0, 400, 400);
this.setBounds(0, 0, 400, 400);
drawPan.add(this);
this.setBackground(Color.RED);
drawFrame.add(drawPan, BorderLayout.NORTH);
drawFrame.add(btnPan, BorderLayout.SOUTH);

this.setBorder(BorderFactory.createLineBorder(Color.BLACK));

this.setVisible(true);
drawPan.setVisible(true);
btnPan.setVisible(true);
drawFrame.setVisible(true);

this.paintComponent(gfx);

drawFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

draw();
}

public void draw() {
ml = new MyListener();
this.addMouseListener(ml);
this.addMouseMotionListener(ml);
}

public void paintComponent(Graphics g) {

super.paintComponent(g);

if(img == null){
img = createImage(this.getWidth(),this.getHeight());
gfx = (Graphics2D) img.getGraphics();
gfx.setPaint(Color.RED);
gfx.fillRect(0, 0, this.getSize().width, this.getSize().height);
gfx.setPaint(Color.RED);
gfx.dispose();
}

gfx.drawImage(img, 0, 0, this);
}


class Action implements ActionListener {

public void actionPerformed(ActionEvent e) {
if(e.getSource() == red){
gfx.setPaint(Color.RED);
repaint();
} else if (e.getSource() == green){
gfx.setPaint(Color.GREEN);
repaint();
} else if (e.getSource() == blue) {
gfx.setPaint(Color.BLUE);
repaint();
} else if (e.getSource() == clear) {
gfx.clearRect(0, 0, drawFrame.getWidth(), drawFrame.getHeight());
repaint();
}
}

}

class MyListener extends MouseAdapter {

public void mousePressed(MouseEvent e) {
prevX = e.getX();
prevY = e.getY();
System.out.println("o ye");
}

public void mouseDragged(MouseEvent e) {
x = e.getX();
y = e.getY();
gfx.drawLine(prevX, prevY, x, y);
repaint();
prevX = x;
prevY = y;

}
}

}

最佳答案

您将 PaintGUI 添加到框架中,但 LayoutManager 不知道大小,也无法设置所需的大小。

设置首选大小(或重写 getPreferredSize 以返回所需大小)

或向 PaintGUI 实例添加一些具有首选大小的组件(例如按钮)

关于java - Swing 应用程序未在 JPanel 内绘制 JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22912282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com