【问题标题】:Swing app not drawing JComponent inside JPanelSwing 应用程序未在 JPanel 内绘制 JComponent
【发布时间】:2014-04-07 20:26:57
【问题描述】:

我目前正在编写一个使用 Swing 库和 Graphics2D 进行绘画的 Java 绘画程序。我的主要 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到任何东西,所以它永远不会画任何东西

标签: java swing awt


【解决方案1】:

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

设置首选大小(或覆盖 getPreferredSize 以返回所需大小)

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

【讨论】:

  • 谢谢!现在它正在以适当的大小绘制矩形。不过我仍然有一个问题——拖着走时,什么也没有发生。它也不会像我想的那样用红色颜料填充图像。关于这些错误的任何提示?
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2012-09-27
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多