1

只是试图理解简单的 Java 事物。Can'get this thing to work。警告:大量错误代码传入。

import java.awt.*;
import java.lang.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.LineBorder;


class DrawFrame  {
    public DrawFrame(){
        DrawPanels panelFrame=new DrawPanels();
        JFrame mainFrame=new JFrame();
        mainFrame.setLayout(new GridLayout(1,3));
        mainFrame.setVisible(true);
        mainFrame.setSize(480, 800);
        mainFrame.setTitle("Title");
        mainFrame.setResizable(false);
        mainFrame.add(panelFrame.panel1);
        mainFrame.add(panelFrame.panel2);
        mainFrame.add(panelFrame.panel3);
        //panelFrame.panel1.getGraphics();
        panelFrame.panel1.add(new DrawBlock());
        panelFrame.panel2.add(new DrawBlock());
        panelFrame.panel3.add(new DrawBlock());
        mainFrame.revalidate();
        mainFrame.repaint();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
class DrawPanels extends JPanel{
     JPanel panel1=new JPanel();
     JPanel panel2=new JPanel();
     JPanel panel3=new JPanel();
    public DrawPanels(){
        panel1.setBackground(Color.ORANGE);
        panel2.setBackground(Color.BLACK);
        panel3.setBackground(Color.RED);
        panel1.setVisible(true);
        panel2.setVisible(true);
        panel3.setVisible(true);
        panel1.setBorder(new LineBorder(Color.BLACK));
        panel2.setBorder(new LineBorder(Color.BLACK));
        panel3.setBorder(new LineBorder(Color.BLACK));

    }
}

class DrawBlock extends JPanel{

    private static final long serialVersionUID = 1L;
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawRect(1, 1,15,15);
    }
}


public class MainClass {

    /**
     * @param args
     */
    public static void main(String[] args) {


        DrawFrame Windos=new DrawFrame();
    }}

如果我的 DrawBlock 类扩展了 JPanel,每个 JPanel 都会有一个白色的小方块,但是,paintComponent() 方法没有反应。如果我将 DrawBlock 扩展到 JComponent,则根本不会有正方形。这可能是初学者的问题,但我无法解决。

4

3 回答 3

2

您遇到的主要问题是DrawBlock实际上没有大小,因此,重绘管理器会自动放弃绘制它......

在此处输入图像描述

尝试修改你的代码......

public class DrawBlock extends JPanel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(18, 18);
    }

    @Override
    public void paintComponent(Graphics g) {
        System.out.println("...");
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        g.drawRect(1, 1, 15, 15);
    }
}

添加该getPreferredSize方法将使布局管理器知道您的组件想要的大小......

警告 - 代码审查 ;)

我不知道你为什么做了你所做的,但让我们把它放在一边......

您创建了一个从JPanel( DrawPanels) 扩展的类,其中包含许多其他JPanels,但不是将它们添加到框架中,而是从中提取面板并将面板提取到框架中......

DrawPanels简单地将其直接添加到框架本身会更有意义......

public static class DrawFrame {

    public DrawFrame() {
        DrawPanels panelFrame = new DrawPanels();
        JFrame mainFrame = new JFrame();
        mainFrame.setLayout(new BorderLayout());
        mainFrame.setSize(480, 800);
        mainFrame.setTitle("Title");
        mainFrame.setResizable(false);
        mainFrame.add(panelFrame);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setVisible(true);
    }
}

public class DrawPanels extends JPanel {

    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();

    public DrawPanels() {
        setLayout(new GridLayout(1, 3));
        panel1.setBackground(Color.ORANGE);
        panel2.setBackground(Color.BLACK);
        panel3.setBackground(Color.RED);
        panel1.setBorder(new LineBorder(Color.BLACK));
        panel2.setBorder(new LineBorder(Color.BLACK));
        panel3.setBorder(new LineBorder(Color.BLACK));

        panel1.add(new DrawBlock());
        panel2.add(new DrawBlock());
        panel3.add(new DrawBlock());

        add(panel1);
        add(panel2);
        add(panel3);

    }
}

注意 - 我将 移至mainFrame.setVisible(true)最后一条语句,这将确保框架在可见之前布局。

我还稍微移动了布局管理器......

于 2013-05-07T09:58:43.020 回答
0

编辑:
尝试删除

mainFrame.revalidate();

这不是一个公认的命令JFrame

此外将@Override Annotation 添加到您的paintComponent:

@Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawRect(1, 1,15,15);
    }

然后它最适合我。

于 2013-05-07T09:29:39.473 回答
0

g.setColor(Color.WHITE)之前使用g.drawRect(1, 1,15,15);

于 2013-05-07T09:54:32.640 回答