Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重叠AWT线和摆动JLabel_Java_Swing_Awt_Jlabel_Overlapping - Fatal编程技术网

Java 重叠AWT线和摆动JLabel

Java 重叠AWT线和摆动JLabel,java,swing,awt,jlabel,overlapping,Java,Swing,Awt,Jlabel,Overlapping,我的应用程序在使用行原语和JLables时出现问题。我试着解释一下: 我必须用线来表示道路,用jlabel来表示城市来绘制车辆路线。我需要使用JLabel,因为每个JLabel都有一个监听器,显示一个包含城市信息的对话框 我重新定义了我的mainJPanel的paint()方法。在该方法中,我首先调用super.paint(),然后画线,最后将标签添加到JPanel 问题在于,无论绘制顺序如何,线条都与标签重叠。有什么建议吗 我不确定这是否是正确的方法,但您可以尝试以下方法: 创建2个面板。

我的应用程序在使用行原语和
JLables
时出现问题。我试着解释一下:

  • 我必须用线来表示道路,用
    jlabel
    来表示城市来绘制车辆路线。我需要使用
    JLabel
    ,因为每个JLabel都有一个监听器,显示一个包含城市信息的对话框
  • 我重新定义了我的main
    JPanel
    paint()
    方法。在该方法中,我首先调用
    super.paint()
    ,然后画线,最后将标签添加到
    JPanel
问题在于,无论绘制顺序如何,线条都与标签重叠。有什么建议吗


我不确定这是否是正确的方法,但您可以尝试以下方法:

  • 创建2个面板。一个用于绘制线,另一个用于绘制建筑(标签)
  • JFrame
    LayeredPane
    中添加两个面板。在较低层中添加带有线条的面板,然后添加带有标签的面板

  • 您还可以通过其他方式使用分层窗格来解决问题。在此处了解更多信息:

    我不确定这是否是正确的方法,但您可以尝试以下方法:

  • 创建2个面板。一个用于绘制线,另一个用于绘制建筑(标签)
  • JFrame
    LayeredPane
    中添加两个面板。在较低层中添加带有线条的面板,然后添加带有标签的面板

  • 您还可以通过其他方式使用分层窗格来解决问题。此处了解更多信息:

    您还可以覆盖
    JPanel
    paintComponent()
    paintChildren()
    方法。
    paintChildren()
    调用您的线条绘制,然后
    super
    绘制
    JLabels
    您还可以覆盖
    paintComponent()
    paintChildren()
    方法。
    在
    paintChildren()

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Ellipse2D;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.*;
    
    public class AddVertexDemo {
    
        public AddVertexDemo() {
        }
    
        private static void createAndShowUI() {
            JFrame frame = new JFrame("AddVertexDemo");
            frame.getContentPane().add(new Gui().getMainPanel());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    createAndShowUI();
                }
            });
        }
    }
    
    class DrawingPanel extends JPanel {
    
        private static final int RADIUS = 6;
        private static final long serialVersionUID = 1L;
        private List<Shape> vertexList = new ArrayList<Shape>();
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            if (vertexList.size() > 1) {
                Shape s0 = vertexList.get(0);
                Shape s1 = null;
                for (int i = 0; i < vertexList.size(); i++) {
                    s1 = vertexList.get(i);
                    drawConnectingLine(g, s0, s1);
                    s0 = s1;
                }
                s1 = vertexList.get(0);
                //drawConnectingLine(g2, s0, s1);
            }
            for (Shape shape : vertexList) {
                g2.setColor(Color.blue);
                g2.fill(shape);
                g2.setColor(Color.blue.darker().darker());
                g2.draw(shape);
            }
        }
    
        private void drawConnectingLine(Graphics g, Shape s0, Shape s1) {
            Rectangle r0 = s0.getBounds();
            Rectangle r1 = s1.getBounds();
            int x0 = r0.x + r0.width / 2;
            int y0 = r0.y + r0.height / 2;
            int x1 = r1.x + r1.width / 2;
            int y1 = r1.y + r1.height / 2;
            g.drawLine(x0, y0, x1, y1);
        }
    
        public void addVertex(Point p) {
            int x = p.x - RADIUS;
            int y = p.y - RADIUS;
            int w = 2 * RADIUS;
            int h = w;
            vertexList.add(new Ellipse2D.Double(x, y, w, h));
            repaint();
        }
    
        public void removeVertex(Point p) {
            if (vertexList.size() > 0) {
                for (int i = vertexList.size() - 1; i >= 0; i--) {
                    if (vertexList.get(i).contains(p)) {
                        vertexList.remove(i);
                        repaint();
                        return;
                    }
                }
            }
        }
    }
    
     class Gui {
    
        private static final Dimension DRAWING_PANEL_SIZE = new Dimension(600, 500);
        private JPanel mainPanel = new JPanel(new BorderLayout());
        private DrawingPanel drawingPanel = new DrawingPanel();
        private JToggleButton addVertexBtn = new JToggleButton("Add Vertex");
        private JToggleButton removeVertexBtn = new JToggleButton("Remove Vertex");
    
        Gui() {
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(addVertexBtn);
            buttonPanel.add(removeVertexBtn);
            DrawPanelMouseListener mouseListener = new DrawPanelMouseListener();
            mouseListener.setDrawingPanel(drawingPanel);
            mouseListener.setGui(this);
            drawingPanel.addMouseListener(mouseListener);
            drawingPanel.setPreferredSize(DRAWING_PANEL_SIZE);
            drawingPanel.setBorder(BorderFactory.createLineBorder(Color.black));
            mainPanel.add(drawingPanel, BorderLayout.CENTER);
            mainPanel.add(buttonPanel, BorderLayout.SOUTH);
        }
    
        public JPanel getMainPanel() {
            return mainPanel;
        }
    
        public boolean isAddingVertex() {
            return addVertexBtn.isSelected();
        }
    
        public boolean isRemovingVertex() {
            return removeVertexBtn.isSelected();
        }
    
        public void setAddingVertex(boolean addingVertex) {
            addVertexBtn.setSelected(addingVertex);
        }
    
        public void setRemovingVertex(boolean removingVertex) {
            removeVertexBtn.setSelected(removingVertex);
        }
    }
    
    class DrawPanelMouseListener extends MouseAdapter {
    
        private DrawingPanel drawingPanel;
        private Gui gui;
    
        public DrawPanelMouseListener() {
        }
    
        public void setGui(Gui gui) {
            this.gui = gui;
        }
    
        public void setDrawingPanel(DrawingPanel drawingPanel) {
            this.drawingPanel = drawingPanel;
        }
    
        @Override
        public void mousePressed(MouseEvent me) {
            if (gui.isAddingVertex() && gui.isRemovingVertex()) {
                gui.setAddingVertex(false);
                gui.setRemovingVertex(false);
                return;
            }
            if (gui.isAddingVertex()) {
                drawingPanel.addVertex(me.getPoint());
                gui.setAddingVertex(false);
            }
            if (gui.isRemovingVertex()) {
                drawingPanel.removeVertex(me.getPoint());
                gui.setRemovingVertex(false);
            }
        }
    }
    

    import java.awt.*;
    导入java.awt.event.*;
    导入java.awt.geom.Ellipse2D;
    导入java.util.ArrayList;
    导入java.util.List;
    导入javax.swing.*;
    公共类AddVertexDemo{
    公共AddVertexDemo(){
    }
    私有静态void createAndShowUI(){
    JFrame=新JFrame(“AddVertexDemo”);
    frame.getContentPane().add(新Gui().getMainPanel());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(空);
    frame.setVisible(true);
    }
    公共静态void main(字符串[]args){
    invokeLater(new Runnable()){
    @凌驾
    公开募捐{
    createAndShowUI();
    }
    });
    }
    }
    类DrawingPanel扩展了JPanel{
    专用静态最终整数半径=6;
    私有静态最终长serialVersionUID=1L;
    private List vertexList=new ArrayList();
    @凌驾
    受保护组件(图形g){
    超级组件(g);
    图形2d g2=(图形2d)g;
    g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
    如果(vertexList.size()>1){
    形状s0=顶点列表。获取(0);
    形状s1=空;
    对于(int i=0;i0){
    对于(int i=vertexList.size()-1;i>=0;i--){
    if(vertexList.get(i).contains(p)){
    顶点列表。删除(i);
    重新油漆();
    返回;
    }
    }
    }
    }
    }
    类Gui{
    专用静态最终尺寸图纸\面板\尺寸=新尺寸(600500);
    private JPanel mainPanel=new JPanel(new BorderLayout());
    私有DrawingPanel DrawingPanel=新DrawingPanel();
    私有JToggleButton addVertexBtn=新JToggleButton(“添加顶点”);
    私有JToggleButton removeVertexBtn=新JToggleButton(“移除顶点”);
    Gui(){
    JPanel buttonPanel=新的JPanel();
    按钮面板添加(addVertexBtn);
    buttonPanel.add(removeVertexBtn);
    DrawPanelMouseListener mouseListener=新DrawPanelMouseListener();
    mouseListener.setDrawingPanel(drawingPanel);
    setGui(this);
    drawingPanel.AddMouseStener(MouseStener);
    drawingPanel.setPreferredSize(图纸面板尺寸);
    drawingPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    添加(drawingPanel,BorderLayout.CENTER);
    主面板。添加(按钮面板,边界布局。南);
    }
    公共JPanel getMainPanel(){
    返回主面板;
    }
    公共布尔值isAddingVertex(){
    返回addVertexBtn.isSelected();
    }
    公共布尔值isRemovingVertex(){
    返回移除vertexbt