JComponent显示完整大小或根本不显示

时间:2013-02-20 14:22:03

标签: java swing layout-manager jcomponent

我有以下代码:

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);
}
}

现在我真的不明白为什么JComponent会在整个屏幕上显示,如果我保留BorderLayout的{​​{1}},或者如果我将其删除则根本不显示JPanel

1 个答案:

答案 0 :(得分:2)

问题来自以下几行:

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

假设您的显示器是1600x900,如果您没有设置BorderLayout,则意味着您使用FlowLayout(具有对齐中心)。首选大小为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());