如何在java中正确打包组件?

如何在java中正确打包组件?,java,swing,Java,Swing,1。需要设置1024*768组件区域的大小 2.需要在(0,0,13661024)上设置线的绘图方向,但不设置中心 我试图在getPreferredSize()方法中更改大小,但这无助于我或做其他效果。我不能这样做。 我试图在getPreferredSize()方法中更改大小,但这无助于我或做其他效果。 我试着改变 这是我无法根据需要更改的代码 package j; import java.awt.BasicStroke; import java.awt.BorderLayout; impor

1。需要设置1024*768组件区域的大小

2.需要在(0,0,13661024)上设置线的绘图方向,但不设置中心

我试图在getPreferredSize()方法中更改大小,但这无助于我或做其他效果。我不能这样做。 我试图在getPreferredSize()方法中更改大小,但这无助于我或做其他效果。 我试着改变 这是我无法根据需要更改的代码

package j; 
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import java.awt.geom.Path2D;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Letter {

    LetterDraw letterDraw = new LetterDraw();

    public Letter() {
        JFrame frame = new JFrame();
        
        JPanel letterDrawWrapper = new JPanel(new GridBagLayout());
        
        letterDrawWrapper.add(letterDraw);
        letterDrawWrapper.setSize(1024,760);
        frame.add(createColorChooser(), BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setSize(111, 111);
        frame.setVisible(true);
    }

    private JColorChooser createColorChooser() {
        JColorChooser colorChooser = new JColorChooser();
        colorChooser.getSelectionModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                letterDraw.setColor(colorChooser.getColor());
            }
        });
        return colorChooser;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Letter();
            }
        });
    }
}

class LetterDraw extends JPanel {

    private Color color;

    public void setColor(Color color) {
        this.color = color;
        
        repaint();
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        
        Graphics2D g = (Graphics2D) graphics;
            g.setColor(color);
    
         
      
        g.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setStroke(new BasicStroke(3));
        //g.setStroke(new BasicStroke(4, BasicStroke.JOIN_BEVEL, 0));
       
        g.setColor(color);
         g.drawLine(11,11,1024,1024);  
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(150, 150);
    }
}```
这是我无法根据需要更改的代码

package j; 
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import java.awt.geom.Path2D;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Letter {

    LetterDraw letterDraw = new LetterDraw();

    public Letter() {
        JFrame frame = new JFrame();
        
        JPanel letterDrawWrapper = new JPanel(new GridBagLayout());
        
        letterDrawWrapper.add(letterDraw);
        letterDrawWrapper.setSize(1024,760);
        frame.add(createColorChooser(), BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setSize(111, 111);
        frame.setVisible(true);
    }

    private JColorChooser createColorChooser() {
        JColorChooser colorChooser = new JColorChooser();
        colorChooser.getSelectionModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                letterDraw.setColor(colorChooser.getColor());
            }
        });
        return colorChooser;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Letter();
            }
        });
    }
}

class LetterDraw extends JPanel {

    private Color color;

    public void setColor(Color color) {
        this.color = color;
        
        repaint();
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        
        Graphics2D g = (Graphics2D) graphics;
            g.setColor(color);
    
         
      
        g.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setStroke(new BasicStroke(3));
        //g.setStroke(new BasicStroke(4, BasicStroke.JOIN_BEVEL, 0));
       
        g.setColor(color);
         g.drawLine(11,11,1024,1024);  
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(150, 150);
    }
}```
需要设置1024*768组件区域的大小

您不应该硬编码大小值。你不知道解决方案是什么

此外,屏幕的分辨率不是可用于绘制的空间。框架有一个标题栏和边框,它占用了定制绘画的空间

绘制代码应该是动态的,取决于面板的可用空间,因此绘制代码将使用
getWidth()
getHeight()
等方法来确定绘制区域

我尝试更改getPreferredSize()中的大小

是的,这将为首选尺寸提供建议。然后你就把框架打包。不要在框架上使用setSize()

//frame.setSize(111, 111);
该语句正在重写由pack()方法确定的大小。摆脱它

g.drawLine(11,11,1024,1024);  
不要硬编码值。面板的大小将随着框架大小的改变而改变。例如,要在面板上绘制对角线,代码应为:

g.drawLine(0, 0, getWidth(), getHeight());  
尝试手动调整框架的大小,以查看线的大小如何变化

编辑:

您没有将面板添加到框架:

frame.add(letterDraw);

好的。但是我应该在哪里插入这个,请给我举个例子。谢谢。
g.drawLine(0,0,getWidth(),getHeight())线从未绘制过。。。我已手动调整了框架的大小)。请再帮我一次!对不起,我错过了一个。如何不使用
getHeigth()等手动设置所有帧大小…我不理解你的最后一个问题。不设置帧大小(这就是为什么需要删除setSize(…)语句)。添加到框架中的每个构件都有一个首选尺寸。当您
pack()
安装框架时,每个组件的首选尺寸将用于确定框架尺寸。