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
我不确定这是否是正确的方法,但您可以尝试以下方法:
JFrame
的LayeredPane
中添加两个面板。在较低层中添加带有线条的面板,然后添加带有标签的面板您还可以通过其他方式使用分层窗格来解决问题。在此处了解更多信息:我不确定这是否是正确的方法,但您可以尝试以下方法:
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