gpt4 book ai didi

Java Swing和绘图问题

转载 作者:行者123 更新时间:2023-11-29 06:45:11 24 4
gpt4 key购买 nike

我画画有问题。我有一个带有一个按钮的框架。我使用鼠标绘制了一个半透明的矩形。但是我有一个小问题,因为在绘制这个矩形时,它是在按钮后面绘制的,我希望这个矩形在按钮上方。

这是截图:

这是代码:

package draw;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;


public class Selection extends JPanel
implements ChangeListener {

/**
*
*/
private static final long serialVersionUID = 1L;
private static final int WIDE = 640;
private static final int HIGH = 640;
private List<Node> nodes = new ArrayList<Node>();
private Point mousePt = new Point(WIDE / 2, HIGH / 2);
private Rectangle mouseRect = new Rectangle();
private boolean selecting = false;

public static void main(String[] args) throws Exception {
EventQueue.invokeLater(new Runnable() {

public void run() {
JFrame f = new JFrame("GraphPanel");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Selection gp = new Selection();
f.add(new JScrollPane(gp), BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
});
}

Selection() {
JButton but=new JButton("Button");
add(but);

this.setPreferredSize(new Dimension(WIDE, HIGH));
this.addMouseListener(new MouseHandler());
this.addMouseMotionListener(new MouseMotionHandler());
}

@Override
public void paintComponent(Graphics g) {
g.setColor(new Color(0x00f0f0f0));
g.fillRect(0, 0, getWidth(), getHeight());


g.setColor(Color.BLACK);
((Graphics2D) g).setComposite(AlphaComposite.getInstance(rule, alpha));
g.fillRect(mouseRect.x, mouseRect.y,
mouseRect.width, mouseRect.height);

g.drawRect(mouseRect.x, mouseRect.y,
mouseRect.width, mouseRect.height);

}
int rule = AlphaComposite.SRC_OVER;
float alpha = 0.85F;


private class MouseHandler extends MouseAdapter {

@Override
public void mouseReleased(MouseEvent e) {
selecting = false;
mouseRect.setBounds(0, 0, 0, 0);
if (e.isPopupTrigger()) {

}
e.getComponent().repaint();
}

@Override
public void mousePressed(MouseEvent e) {
mousePt = e.getPoint();

Node.selectNone(nodes);
selecting = true;
e.getComponent().repaint();
}
}

private class MouseMotionHandler extends MouseMotionAdapter {


@Override
public void mouseDragged(MouseEvent e) {
if (selecting) {
mouseRect.setBounds(
Math.min(mousePt.x, e.getX()),
Math.min(mousePt.y, e.getY()),
Math.abs(mousePt.x - e.getX()),
Math.abs(mousePt.y - e.getY()));

}
e.getComponent().repaint();
}
}



/** A Node represents a node in a graph. */
private static class Node {

private Color color;

private boolean selected = false;
private Rectangle b = new Rectangle();

/** Draw this node. */
public void draw(Graphics g) {
g.setColor(this.color);

if (selected) {
g.setColor(Color.darkGray);
g.drawRect(b.x, b.y, b.width, b.height);
}
}




/** Mark this node as slected. */
public void setSelected(boolean selected) {
this.selected = selected;
}

/** Select no nodes. */
public static void selectNone(List<Node> list) {
for (Node n : list) {
n.setSelected(false);
}
}
}



@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub

}

}

我该如何解决这个问题?

最佳答案

您在按钮后面的面板上绘制矩形。 (没有办法让底层组件在子组件之上绘制。)如果矩形应该在按钮之上,则您正在绘制的组件必须在按钮之上。 (不过这样的组件必须是不透明的,因为如果它是不透明的,它将始终覆盖按钮并且按钮将不可见。

我建议您在某个玻璃板或其他东西上绘制矩形,它位于整个框架的顶部。

关于Java Swing和绘图问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6121641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com