我的應用程序中使用行原語和JLables
有問題。我試圖解釋它:重疊AWT行和Swing JLabels
- 我必須使用線條來表示道路繪製車輛路線和
JLabels
代表城市。我需要使用JLabels
,因爲每個JLabel都有一個監聽器,顯示一個關於城市信息的對話框。 - 我重新定義了
paint()
我的主要方法JPanel
。在該方法中,我首先調用super.paint()
,然後繪製線條,最後將標籤添加到JPanel
。
問題是,行與標籤重疊,無論繪畫順序如何。有什麼建議嗎?
我的應用程序中使用行原語和JLables
有問題。我試圖解釋它:重疊AWT行和Swing JLabels
JLabels
代表城市。我需要使用JLabels
,因爲每個JLabel都有一個監聽器,顯示一個關於城市信息的對話框。paint()
我的主要方法JPanel
。在該方法中,我首先調用super.paint()
,然後繪製線條,最後將標籤添加到JPanel
。問題是,行與標籤重疊,無論繪畫順序如何。有什麼建議嗎?
我不知道,這是做到這一點的正確方法,但你可以試試這個:
JFrame
的LayeredPane
中添加兩個面板。在底層添加面板,然後使用標籤面板。您可以通過其他方式使用LayeredPanes
來解決您的問題。在此處瞭解更多信息:How to use Layered Panes in java
您也可以覆蓋JPanel
的paintComponent()
或paintChildren()
方法。 在paintChildren()
呼叫您的線條繪製,然後super
繪製JLabels
。
+1,通過重寫paintComponent()方法而不是paint()來完成自定義繪畫。然後,在完成自定義繪畫後,子標籤將被繪製。 – camickr 2011-12-21 17:14:28
anothe的方法應該是
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);
}
}
}
公正的情況下做你自己是_not_目標:有很不錯的開放,自由和易於使用的框架,在野外 - f.i. JUNG(沒有鏈接方便,對不起) – kleopatra 2011-12-21 09:48:41