java – 使用BorderLayout将图形添加到JFrame中
我正在尝试做一个简单的作业,在那里我显示一行文字,显示门对象是否打开.在其下面,我直观地表示它(使用drawRect)方法.在底部我有两个按钮,可以打开或关闭门,从而改变文本和矩形.
编辑:现在可以编译的代码列表: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class Test { public static void main(String[] args) { // Creates new JFrame called frame,with title "Door" // (displayed at top of screen). JFrame frame = new JFrame ("Door"); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); TempDoorPanel panel = new TempDoorPanel(); frame.add(panel); frame.pack(); frame.setVisible(true); } } class Door { private String state; private String message; Door (String state) { this.state = state; message = "The door is currently closed."; } public boolean isOpen() { return state.equals ("open"); } public boolean isClosed() { return state.equals ("closed"); } public void setState(String state) { this.state = state; } public String getMessage() { return message; } public void open() { if (state.equals("open")) { message = "The door is already open."; } else { state = "open"; message = "The door has been opened."; } } public void drawOpenDoor (Graphics page) { page.drawRect(100,100,100); } } class TempDoorPanel extends JPanel { private Door door; private JTextField currentStateOfDoor; private JButton openDoor; public TempDoorPanel() { super.setLayout(new BorderLayout()); door = new Door("closed"); super.setBackground(Color.blue); super.setPreferredSize(new Dimension (360,400)); currentStateOfDoor = new JTextField(14); currentStateOfDoor.setText(door.getMessage()); super.add(currentStateOfDoor,BorderLayout.NORTH); openDoor = new JButton("Open Door"); class openDoorListener implements ActionListener { public void actionPerformed (ActionEvent event) { door.open(); repaintText(); } } openDoorListener openlistener = new openDoorListener(); openDoor.addActionListener(openlistener); JPanel holder = new JPanel(); holder.add(openDoor); super.add(holder,BorderLayout.SOUTH); } private void repaintText() { currentStateOfDoor.setText(door.getMessage()); // These methods are from Door class. } public void paintComponent (Graphics page) { super.paintComponent(page); if (door.isOpen()) door.drawOpenDoor(page); // isOpen is a boolean method from Door class. } } 什么有效: >按钮出现在屏幕上的正确位置,在BorderLayout.SOUTH,一个接一个. 我正在努力解决的问题: >我不知道如何在蓝色区域的中间正确显示矩形.我试过改变矩形的坐标和大小,这根本不会改变它的大小.我可以把它作为drawRect(100,100)并且它什么都不改变. 问题: >如何在BorderLayout中放置一个矩形? 解决方法
因为您向JPanel添加组件,所以您在JTextField上绘制的内容将覆盖您的绘图.
解: 1)通过检查drawRect(..)方法中的JTextField高度来补偿这一点 或更好 2)除非无法帮助,否则不要将组件添加到您正在绘制的同一JPanel中. 所以基本上我让你的TempDoorPanel添加一个新的JPanel到BorderLayout.CENTER,这是我们现在可以使用drawRect(0,10,10)的绘图面板,它将显示在JPanel drawingPanel的左上角. >也不要在JPanel上调用setPreferredSize而是覆盖getPreferredSize()并返回适合您的绘图的Dimensions. 请参阅使用第2点的示例: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Test { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame("Door"); frame.setDefaultCloSEOperation(JFrame.DISPOSE_ON_CLOSE); TempDoorPanel panel = new TempDoorPanel(); frame.add(panel); frame.pack(); frame.setVisible(true); } }); } } class Door { private String state; private String message; public Door(String state) { this.state = state; message = "The door is currently closed."; } public void drawOpenDoor(Graphics page) { page.setColor(Color.GREEN); page.drawRect(0,10); } } class TempDoorPanel extends JPanel { private Door door; private JTextField currentStateOfDoor; private JButton openDoor; public TempDoorPanel() { super.setLayout(new BorderLayout()); door = new Door("closed"); currentStateOfDoor = new JTextField(14); //AcurrentStateOfDoor.setText(door.getMessage()); super.add(currentStateOfDoor,BorderLayout.NORTH); openDoor = new JButton("Open Door"); final JPanel drawingPanel = new JPanel() { @Override protected void paintComponent(Graphics grphcs) { super.paintComponent(grphcs); // if (door.isOpen()) { door.drawOpenDoor(grphcs); // } // isOpen is a boolean method from Door class. } }; drawingPanel.setBackground(Color.blue); add(drawingPanel); class openDoorListener implements ActionListener { public void actionPerformed(ActionEvent event) { //door.open(); repaintText(); drawingPanel.repaint();//so paint component of drawing panel is called } } openDoorListener openlistener = new openDoorListener(); openDoor.addActionListener(openlistener); JPanel holder = new JPanel(); holder.add(openDoor); super.add(holder,BorderLayout.SOUTH); } @Override public Dimension getPreferredSize() { return new Dimension(300,300); } private void repaintText() { // currentStateOfDoor.setText(door.getMessage()); // These methods are from Door class. } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |