gpt4 book ai didi

Java JComponent 绘制——几乎可以工作

转载 作者:行者123 更新时间:2023-12-01 18:40:43 24 4
gpt4 key购买 nike

我几乎让 repaint() Jcomponent 工作了。我让它工作,然后尝试进行绝对定位,但现在不起作用。

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public class DDHGenericFrame {
private static final long serialVersionUID = 1L;
DDHGenericPanel d = new DDHGenericPanel();
//DDHCircleOne o = new DDHCircleOne();

public DDHGenericFrame() {
initUI();
}

public final void initUI() {
JFrame frame = new JFrame("AbsoluteLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Draw Circle");
frame.setBackground(Color.green);
frame.setLayout(null);
frame.setSize(300,425);
frame.add(d);
// frame.add(o);//didn't work neither
frame.setVisible(true);
}

public static void main(String[] args) {
DDHGenericFrame ex = new DDHGenericFrame();
}
}

第 2 类:(这是我要设置的 JComponent)

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;

public class DDHTestDraw extends JComponent {
public DDHTestDraw () {
settPreferredSize();
}

public void settPreferredSize() {
Dimension d = new Dimension(25,25);
setPreferredSize(d);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Text",20,20);
}
}

我将组件添加到容器中,然后将容器添加到 JPanel 中,然后将 JPanel 添加到 JFrame 中。我认为这应该有效。我有一套首选尺寸。我曾经工作过,但现在不行了。

我希望能够制作一个圆形组件。我希望该圆能够在 Jframe 上的任何位置绘制,然后我希望该圆能够根据一定的时间长度移动。我将制作一款游戏,其中的圆圈从顶部下降,然后落到底部。当我让它工作时,我确实将圆圈写入 JPanel,这是一段复杂的代码。但我不得不回到以前简单的写单个图形单词的方法。

最佳答案

  • 当您使用空布局时,完全负责确保添加的组件具有正确的位置和大小(不是首选大小)设置。
  • 您几乎不应该使用空布局。
  • 通过创建一个逻辑类来表示 Circle(而不是组件),这样的事情不是会更好吗?然后,您的绘图 JPanel 可以保存逻辑圆的集合,并且绘图 JPanel 可以负责在其 PaintComponent 方法中绘制每个圆。

编辑
您的评论/我的回复:

when you say never use an absolute layout, the company that I worked for always used a absolute layout only.

有时它很有用,但不适用于创建典型的组件填充 GUI。否则 GUI 会变得很难修改和维护。

When you mean a logical class you mean a class that just creates one circle.

是的,它包含该圆的所有必要属性,例如颜色、位置、运动等。

Then the Jpanel would draw each circle.

是的。我想象绘图 JPanel 有一个 ArrayList<MyCircle>其中,paintComponent 方法迭代此列表。

when you say Size this is a property in JComponent.

我认为它是 Component(JComponent 的父级)的属性。如果您使用空布局,则所有组件都必须指定其大小和位置。否则,组件默认位置为 [0, 0],大小为 [0, 0]。

<小时/>

编辑2

public Dimension Size(int a, int b) { 
Dimension d = new Dimension();
d.width = a;
d.height = b;
return d;
}

This is the code that I used for the preferred size. I am at a lost why this doesn't work.

此代码对 Component/JComponent 的大小或 PreferredSize 属性没有影响。它对你没有帮助,我并不感到惊讶。您要么必须覆盖 getSize()getPreferredSize()或明确调用 setSize(...)getPreferredSize(...)更改属性的状态。

I am going to try it with a different layout manager and see but I would see the difference between one layout manager or another.

我不知道如何解释这一点。

<小时/>

编辑3
您声明:

I worked at one company and we used absulute layouts all of the time. How would an absolute layout not work as good as, say BorderLayout(). To me the BorderLayout() are harder to implement. Or is it that you use a Jframe() with a BorderLayout, and then insert a Jpanel into an already existing position that is already also a BorderLayout(). I always have trouble getting my buttions and positions correct in a layout that is something different than a BorderLayout(). Can you post an example that would be easier to use than

我猜您想要一个使用布局管理器比使用绝对定位更容易的示例。

让我们以一个非常简单的计算器为例,它带有用于数字输入和简单操作的按钮。同样,这个示例是非常基本的,并且是非功能性的,但用于说明布局的使用。我可以轻松地将按钮放置在 GridLayout-使用 JPanel 中,然后将该按钮 JPanel 放置到 BorderLayout-使用 JPanel 中的 BorderLayout.CENTER 位置,并与 JTextField 一起显示,放置在相同的 BorderLayout-使用 JPanel 中的 BorderLayout.PAGE_START位置:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;

public class CalcEg {
private static final float BTN_FONT_SIZE = 20f;
private static final String[][] BTN_LABELS = {
{"7", "8", "9", "-"},
{"4", "5", "6", "+"},
{"1", "2", "3", "/"},
{"0", ".", " ", "="}
};
private static final int GAP = 4;
private JPanel mainPanel = new JPanel(new BorderLayout(GAP, GAP));
private JPanel buttonPanel = new JPanel();
private JTextField display = new JTextField();

public CalcEg() {
int rows = BTN_LABELS.length;
int cols = BTN_LABELS[0].length;
buttonPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
for (String[] btnLabelRow : BTN_LABELS) {
for (String btnLabel : btnLabelRow) {
if (btnLabel.trim().isEmpty()) {
buttonPanel.add(new JLabel());
} else {
JButton btn = createButton(btnLabel);
buttonPanel.add(btn);
}
}
}
display.setFont(display.getFont().deriveFont(BTN_FONT_SIZE));
display.setEditable(false);
display.setFocusable(false);
display.setBackground(Color.white);

mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
mainPanel.add(buttonPanel, BorderLayout.CENTER);
mainPanel.add(display, BorderLayout.PAGE_START);
}

private JButton createButton(String btnLabel) {
JButton button = new JButton(btnLabel);
button.setFont(button.getFont().deriveFont(BTN_FONT_SIZE));
return button;
}

public JComponent getMainComponent() {
return mainPanel;
}

private static void createAndShowGui() {
CalcEg mainPanel = new CalcEg();

JFrame frame = new JFrame("CalcEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel.getMainComponent());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

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

这将导致计算器看起来像这样:

Basic Calculator

现在,您肯定可以说您可以使用 null 布局和 setbounds(...) 来生成此内容。 ,这一切都很好,但现在说您对这个计算器不满意,现在希望它具有一些科学计算功能。假设您现在想要添加平方、平方根、指数和对数按钮,但不仅如此,假设您希望在显示屏下方以及数字和基本操作按钮上方添加按钮。如果您要使用空布局来执行此操作,则必须重新定位添加的任何新组件下方和右侧的所有组件,并且必须扩大 JTextField 的大小,所有计算都很繁琐且容易出现问题错误。

如果您使用布局管理器,则只需添加一行代码,实际上是向数组添加一行:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;

public class CalcEg {
private static final float BTN_FONT_SIZE = 20f;
private static final String[][] BTN_LABELS = {
{"sqr", "sqrt", "exp", "log"}, // ******* Line Added Here *********
{"7", "8", "9", "-"},
{"4", "5", "6", "+"},
{"1", "2", "3", "/"},
{"0", ".", " ", "="}
};
private static final int GAP = 4;
private JPanel mainPanel = new JPanel(new BorderLayout(GAP, GAP));
private JPanel buttonPanel = new JPanel();
private JTextField display = new JTextField();

public CalcEg() {
int rows = BTN_LABELS.length;
int cols = BTN_LABELS[0].length;
buttonPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
for (String[] btnLabelRow : BTN_LABELS) {
for (String btnLabel : btnLabelRow) {
if (btnLabel.trim().isEmpty()) {
buttonPanel.add(new JLabel());
} else {
JButton btn = createButton(btnLabel);
buttonPanel.add(btn);
}
}
}
display.setFont(display.getFont().deriveFont(BTN_FONT_SIZE));
display.setEditable(false);
display.setFocusable(false);
display.setBackground(Color.white);

mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
mainPanel.add(buttonPanel, BorderLayout.CENTER);
mainPanel.add(display, BorderLayout.PAGE_START);
}

private JButton createButton(String btnLabel) {
JButton button = new JButton(btnLabel);
button.setFont(button.getFont().deriveFont(BTN_FONT_SIZE));
return button;
}

public JComponent getMainComponent() {
return mainPanel;
}

private static void createAndShowGui() {
CalcEg mainPanel = new CalcEg();

JFrame frame = new JFrame("CalcEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel.getMainComponent());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

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

这将导致这个 GUI:

Enhanced Calculator

这又是一个非常简单的示例,但一般原则适用于任何包含 JButtons、JTextComponents 等组件的 GUI。

关于Java JComponent 绘制——几乎可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037057/

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