sách gpt4 ai đã đi

java - 在 JPanel 中添加 JPanel - 嵌套的 JPanel 不会显示

In lại 作者:行者123 更新时间:2023-12-01 05:06:21 30 4
mua khóa gpt4 Nike

新代码

package test;

nhập javax.swing.*;
nhập java.awt.*;


public class TestWindow extends JFrame{
//------------------------------------------------------------------------------
public static void main(String[] args) {
new TestWindow();
}
//------------------------------------------------------------------------------
public TestWindow(){
setSize(300,300);
this.setUndecorated(true);
add(new Background());
setVisible(true);
}
//------------------------------------------------------------------------------

private class Background extends JPanel{
public Background(){
add(b);
repaint();
}
//------------------------------------------------------------------------------
Bubble b = new Bubble();
@Ghi đè
public void paintComponent(Graphics g){
super.paintComponent(g);
Color c = Color.cyan;
g.setColor(c);
g.fillRect(0, 0,getWidth(), getHeight());
}
//------------------------------------------------------------------------------
private class Bubble extends JPanel{
@Ghi đè
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.green);
g.drawOval(0, 0, Background.this.getWidth(), Background.this.getHeight());
}
}
//------------------------------------------------------------------------------
}
}

Đầu ra

nhập mô tả hình ảnh ở đây

câu hỏi

目的是绘制一个带有绿色圆圈的青色窗口。稍后我会将组件添加到绿色圆圈中,这样看起来就像有一个带有青色背景的窗口和一个带有组件的绿色圆圈。
然而,输出只是青色背景。没有圈。

我尝试将 XOR 模式设置为青色,但这也不起作用。我嵌套类错了吗?

1 Câu trả lời

主要问题在这里......

    public void paintComponent(Graphics g){
super.paintComponent(g);
Color c = Color.cyan;
g.setColor(c);
g.fillRect(0, 0,getWidth(), getHeight());
add(b);
repaint();
}

不仅在你的paint方法中向你的容器添加组件,你还调用了repaint,这一切都会对你不利。

当您的组件出于各种原因需要更新时,重绘管理器会调用 Paint。您永远不应调用任何可能使其无效的方法,否则需要重新绘制组件,这样做会使您陷入 CPU 烧毁的滑坡。

相反。

  1. hiện hữu Background 组件的构造函数中添加您的 Bubble 组件
  2. 覆盖这两个组件的 getPreferredSize 方法并提供有用的提示,以便布局管理器了解码件可能实际需要使用多少空间

您面临的主要问题(除了糟糕的绘画)是组件报告自己不需要高度或宽度,这意味着当布局管理器来布置它们时,它们实际上是不可见的

làm mới

我建议你看看

复活节彩蛋

为了接受建议和努力,让我给你一点帮助......

nhập mô tả hình ảnh ở đây

我建议您通读代码,返回 Java 文档和教程并尝试弄清楚发生了什么;)

public class CircleControl {

public static void main(String[] args) {
new CircleControl();
}

public CircleControl() {
EventQueue.invokeLater(new Runnable() {
@Ghi đè
công khai void run() {
thử {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setLayout(new GridBagLayout());
add(new Bubble());
}

@Ghi đè
public Dimension getPreferredSize() {
return new Dimension(200, 300);
}

@Ghi đè
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

Color startColor = brighten(Color.CYAN, 0.75f);
Color endColor = brighten(Color.CYAN, 0.5f);

LinearGradientPaint lgp = new LinearGradientPaint(
new Point(0, 0),
new Point(0, getHeight()),
new float[]{0f, 1f},
new Color[]{startColor, endColor});

g2d.setPaint(lgp);
g2d.fill(new Rectangle(getWidth(), getHeight()));
g2d.dispose();

}
}

public class Bubble extends JPanel {

public Bubble() {
Font font = UIManager.getFont("Label.font");
setFont(font.deriveFont(Font.BOLD, 48));
setForeground(Color.WHITE);
setBackground(darken(Color.CYAN, 0.3f));
setOpaque(false);
}

@Ghi đè
public Dimension getPreferredSize() {
return new Dimension(150, 150);
}

@Ghi đè
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

int x = (getWidth() - 150) / 2;
int y = (getHeight() - 150) / 2;

Color startColor = brighten(getBackground(), 0.05f);
Color endColor = getBackground();

LinearGradientPaint lgp = new LinearGradientPaint(
new Point(x, y),
new Point(x, y + 150),
new float[]{0f, 1f},
new Color[]{startColor, endColor});
g2d.setPaint(lgp);
g2d.fill(new Ellipse2D.Double(x, y, 150, 150));

FontMetrics fm = g2d.getFontMetrics();
x = x + ((150 - fm.stringWidth("22")) / 2);
y = y + ((150 / 2) + fm.getAscent());
g2d.setColor(getForeground());
g2d.drawString("22", x, y);

}
}

public static Color brighten(Color color, double fraction) {
int red = (int) Math.round(Math.min(255, color.getRed() + 255 * fraction));
int green = (int) Math.round(Math.min(255, color.getGreen() + 255 * fraction));
int blue = (int) Math.round(Math.min(255, color.getBlue() + 255 * fraction));
int alpha = color.getAlpha();
return new Color(red, green, blue, alpha);
}

public static Color darken(Color color, double fraction) {
int red = (int) Math.round(Math.max(0, color.getRed() - 255 * fraction));
int green = (int) Math.round(Math.max(0, color.getGreen() - 255 * fraction));
int blue = (int) Math.round(Math.max(0, color.getBlue() - 255 * fraction));
int alpha = color.getAlpha();
return new Color(red, green, blue, alpha);
}
}

关于java - 在 JPanel 中添加 JPanel - 嵌套的 JPanel 不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14907535/

30 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com