0

次のコードがあります。

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を保持すると画面全体に表示されるBorderLayoutJPanelか、削除するとまったく表示されないのか、今ではよくわかりません。

4

1 に答える 1

2

問題は次の行から発生します。

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

ディスプレイが1600x900であると想像してください。ボーダーレイアウトを設定しない場合は、FlowLayoutを使用することを意味します(配置は中央に配置されます)。推奨サイズは400x400です(オーバーライドのため、setPreferredSizeを呼び出すことはここでは役に立ちません)。したがって、FlowLayoutはコンポーネントをポイント(600、5)の周りに配置します。したがって、(600、5、400、400)である赤い長方形を塗りつぶします。これは、その長方形の左上隅がg.fillRect(getX(), getY(),...、コンポーネントの境界の外側にある600,5(と呼ぶので)にあることを意味します。

BorderLayoutを使用すると、コンポーネントは境界(0,0,1600,900)(フレームの境界を除く)を取得し、g.fillRect(getX()、getY()、...を呼び出すとx、y以降は機能します)は(0,0)です。

代わりにこれを呼んでみてください:

g.fillRect(0,0, getWidth(), getHeight());
于 2013-02-20T14:44:20.077 に答える