绘图区域未显示(未正确对齐?)

时间:2018-04-23 20:15:53

标签: java swing

我想知道为什么我创建的绘图区域没有显示在我的第二个面板中。我已经检查了他们的位置使用getX和getY(250,0,这是我假设它是正确的区域,因为那将是第二个面板的左上角),但我似乎无法弄清楚出了什么问题。我认为这是一个问题,有一些基本的学习方面,我没有权利,但似乎无法弄清楚问题是什么。如果你能向我解释出现了什么问题以及我将在哪里修理它的正确方向,那将是值得赞赏的。当我独立时,我确实有绘图区域工作;问题是我在使用其他GUI组件时无法显示它。

谢谢^^

代码:
包绘图;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class DrawingApp extends JFrame{
public static void main(String[] args) {

    GridLayout grid = new GridLayout(1, 2);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final DrawingComponent drawingArea = new DrawingComponent();
    drawingArea.setSize(600, 250);
    JPanel leftPanel = new JPanel();
    JPanel rightPanel = new JPanel();
    JSlider greSlider = new JSlider();
    JSlider bluSlider = new JSlider();
    JSlider redSlider = new JSlider();
    Point leftLocation = new Point(0, 0);
    Point rightLocation = new Point(250, 0);

    JLabel greLabel = new JLabel("Green");
    JLabel bluLabel = new JLabel("Blue");
    JLabel redLabel = new JLabel("Red");

    rightPanel.setLocation(rightLocation);
    drawingArea.setLocation(rightLocation);
   // JButton button = new JButton("Hello");

    leftPanel.setSize(250, 600);
    //leftPanel.setLocation(leftLocation);
    leftPanel.setBorder((BorderFactory.createLineBorder(Color.black)));

    rightPanel.setSize(250, 600);
    //rightPanel.setLocation(rightLocation);
    rightPanel.setBorder((BorderFactory.createLineBorder(Color.green)));

    leftPanel.add(greLabel);
    leftPanel.add(greSlider);
    leftPanel.add(bluLabel);
    leftPanel.add(bluSlider);
    leftPanel.add(redLabel);
    leftPanel.add(redSlider);
    rightPanel.add(drawingArea);
    frame.add(leftPanel);
    frame.add(rightPanel);
    //rightPanel.add(button);
    frame.setSize(500, 600);
    frame.setLayout(grid);





    leftPanel.setVisible(true);
    rightPanel.setVisible(true);
    frame.setVisible(true);


    class SlideClickListener implements ChangeListener
    {

        ChangeListener slideListener = new ChangeListener(){

         @Override
        public void stateChanged(ChangeEvent e){
            if(e.getSource() == greSlider){

            }
        }
    };


        public void stateChanged(ChangeEvent ce) {
            throw new UnsupportedOperationException("Not supportedyet.");    
        }
    }

    class MouseClickListener implements MouseListener
    {  
        public void mouseClicked(MouseEvent event)
        {  
           int x = event.getX();
           int y = event.getY();
           System.out.println(x + " " + y);
           drawingArea.drawPoints(x,y);
        }
        // Do­nothing methods
        public void mouseReleased(MouseEvent event) {}
        public void mousePressed(MouseEvent event) {}
        public void mouseEntered(MouseEvent event) {}
        public void mouseExited(MouseEvent event) {}
     }

    MouseListener listener = new MouseClickListener();
    drawingArea.addMouseListener(listener);


}

}

如果需要,我可以包含DrawingComponent类,但假设它不是因为我确定该类正在工作。

1 个答案:

答案 0 :(得分:1)

  

我认为这是一个基本学习方面的问题,我没有权利,

您似乎无法理解布局管理器的工作原理:

leftPanel.setSize(250, 600);
//leftPanel.setLocation(leftLocation);
rightPanel.setSize(250, 600);
//rightPanel.setLocation(rightLocation);

这些陈述都不会做任何事情。布局管理器的工作是确定添加到面板的组件的大小和位置。在您的情况下,您尝试使用GridLayout。因此,在考虑到框架的装饰之后,添加到网格中的组件将被赋予尺寸。因此,即使框架可能是(500,600),面板可用的空间也会更少(因为您需要考虑标题栏和框架的边框)。

此外,在将组件添加到面板之前,应将布局管理器分配给面板。

leftPanel.setVisible(true);
rightPanel.setVisible(true);

默认情况下,Swing组件(JFrame,JDialog等顶级容器除外)是可见的,因此上述代码不执行任何操作。

  

如果需要,我可以包含DrawingComponent类,

在问题解决之前,你不知道相对于问题是什么或不是什么。我的猜测是你DrawingComponent的问题。同样,JPanel的默认布局管理器是FlowLayout,它尊重添加到其中的任何组件的首选大小。我猜测你的DrawingPanel没有将getPreferredSize()方法实现为首选大小为(0,0),因此无需绘制任何内容。

阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例,以帮助您入门。

我建议您查看本教程的Layout Managers部分,了解布局基础知识和工作示例。