gpt4 book ai didi

java - JComponent 显示完整尺寸或根本不显示

转载 作者:行者123 更新时间:2023-12-02 07:15:29 25 4
gpt4 key购买 nike

我有以下代码:

package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;

public class ModuleGui extends JComponent {

protected ShapeResizeHandler shapeResizeHandler = new ShapeResizeHandler();
public ModuleGui(){
this.addMouseListener(shapeResizeHandler);
this.addMouseMotionListener(shapeResizeHandler);
}

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

@Override
public void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.red);
g.fillRect(getX(), getY(), getWidth(), getHeight());
}

private class ShapeResizeHandler extends MouseAdapter{
public void mousePressed(MouseEvent e){
System.out.println(e.getPoint().getX() + " " + e.getPoint().getY());
}

public void mouseReleased(){
}

public void mouseDragged(MouseEvent e){
}
}
}

在以下类中使用:

package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Gui {
private JFrame mainFrame = null;

public Gui(){
mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setTitle("--");
mainFrame.setMinimumSize(new Dimension(800, 600));
mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
mainFrame.getContentPane().setLayout(new BorderLayout());

ModuleGui moduleGui = new ModuleGui();
moduleGui.setPreferredSize(new Dimension(400, 400));

JPanel aux = new JPanel();
aux.setLayout(new BorderLayout());
aux.add(moduleGui);

mainFrame.getContentPane().add(aux);
mainFrame.pack();
mainFrame.setVisible(true);
}
}

现在我真的不明白为什么如果我为JPanel保留BorderLayoutJComponent要么显示在整个屏幕上,要么不显示如果我删除它就根本不显示。

最佳答案

问题来自以下行:

g.fillRect(getX(), getY(), getWidth(), getHeight());

想象一下,你的显示器是1600x900,如果你不设置BorderLayout,则意味着你使用FlowLayout(对齐方式为CENTERED)。首选大小是 400x400(因为您的覆盖,顺便说一句,调用 setPreferredSize 在这里是无用的),所以这意味着 FlowLayout 会将您的组件定位在点 (600, 5) 周围。因此,您填充了一个红色矩形,即 (600, 5, 400, 400),这意味着该矩形的左上角位于 600,5 (因为您调用 g.fillRect(getX(), getY(),... ),它超出了组件的边界.

当您使用 BorderLayout 时,您的组件获取边界 (0,0,1600,900) (减去框架的边框)并调用 g.fillRect(getX(), getY(),... 将会起作用,因为x,y 为 (0,0)。

尝试调用它:

g.fillRect(0,0, getWidth(), getHeight());

关于java - JComponent 显示完整尺寸或根本不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14982139/

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