2011-12-21 67 views
1

我的應用程序中使用行原語和JLables有問題。我試圖解釋它:重疊AWT行和Swing JLabels

  • 我必須使用線條來表示道路繪製車輛路線和JLabels代表城市。我需要使用JLabels,因爲每個JLabel都有一個監聽器,顯示一個關於城市信息的對話框。
  • 我重新定義了paint()我的主要方法JPanel。在該方法中,我首先調用super.paint(),然後繪製線條,最後將標籤添加到JPanel

問題是,行與標籤重疊,無論繪畫順序如何。有什麼建議嗎?

enter image description here

+0

公正的情況下做你自己是_not_目標:有很不錯的開放,自由和易於使用的框架,在野外 - f.i. JUNG(沒有鏈接方便,對不起) – kleopatra 2011-12-21 09:48:41

回答

2

我不知道,這是做到這一點的正確方法,但你可以試試這個:

  1. 創建2個板。一個用於繪製線條,另一個用於繪製建築物(標籤)。
  2. JFrameLayeredPane中添加兩個面板。在底層添加面板,然後使用標籤面板。

您可以通過其他方式使用LayeredPanes來解決您的問題。在此處瞭解更多信息:How to use Layered Panes in java

3

您也可以覆蓋JPanelpaintComponent()paintChildren()方法。 在paintChildren()呼叫您的線條繪製,然後super繪製JLabels

+0

+1,通過重寫paintComponent()方法而不是paint()來完成自定義繪畫。然後,在完成自定義繪畫後,子標籤將被繪製。 – camickr 2011-12-21 17:14:28

2

anothe的方法應該是

enter image description here

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