我最近一直在努力制作一个能够在篮球比赛中追踪一个人成功的计划。我有一个法庭图设置,我的想法是,在点击“制造”或“未命中”按钮后,你可以点击球场上的一个位置,它会记录你的成功和失误,同时保持两者的结合在一边。我认为最简单的方法是用一个巨大的按钮网格(20x20)填充球场,当你点击一个按钮时,它会将文本更改为“x”或“o”,具体取决于它是否为拍了一下。我没有为各种按钮创建监听器的问题,但按钮显示在法院线的图形顶部。使按钮透明(我试过)使它看起来好一点,但我理想的解决方案是使网格中的按钮不可见,但可点击并能够在点击后更改其文本。
我还没有找到这样的方法或其他方法来实现这一点,所以如果任何人有任何经验或输入创建可以使其以这种方式起作用的东西会有所帮助。我想我的最终问题是有没有办法让按钮看不见但可点击?如果没有简单的方法可以做到这一点(我担心),你有没有其他想法可以使这个程序有效地发挥功能,可能不涉及按钮?
非常感谢,任何想法都会对我有所帮助。
我还认为我可能会注意到代码中有一个单独的驱动程序,即使它可能没有什么区别。
答案 0 :(得分:0)
你可以做这样的事情
对于这两个按钮,只需更改boolean make
即可。你会明白为什么以后
boolean make = false;
makeButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent){
make = true;
}
});
missButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent){
make = false;
}
});
然后你有paintComponent
protected void paintComponent(Graphics g){
super.paintComponent(g);
if (make){
drawOval(whataver are your point requirements)
} else {
// draw an x at whatever points
}
}
您可以从上面看到我使用了made
变量
现在要获取位置,你可以做这样的事情
Point p;
courtPanel.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
p = e.getLocationOnScreen();
repaint();
}
});
您绘制的组件将根据这些点坐标进行绘制。
基本上,我上面列出的所有内容都是:1)当按下
makeButton
时,它会将设置更改为made
,因此当绘制面板时,当{{1}时,它会被画圆圈和X
按下了。2)我添加
missButtton
courtPanelmouseListener to the
xbecuase everytime the panel is clicked somewhere, that's the point on the floor where is it either painted an
圈子
如果您希望绘制多个or a
和X
,则可以执行此类操作
circle
答案 1 :(得分:0)
透明组件的问题基本上是几乎不可能实际点击它们;)
另一种解决方案可能是在渲染地图的组件上使用MouseListener
,并简单地从点击点转换为“虚拟网格”,然后您可以在顶部渲染,例如...... / p>
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class BaseBallMap {
public static void main(String[] args) {
new BaseBallMap();
}
public BaseBallMap() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class TestPane extends JPanel {
public static final int GRID_COUNT = 20;
private BufferedImage map;
private List<Point> cells;
public TestPane() {
cells = new ArrayList<>(400);
try {
map = ImageIO.read(new File("Map.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
if (getMapBounds().contains(p)) {
p.x -= getXOffset();
p.y -= getYOffset();
int col = p.x / getColumnWidth();
int row = p.y / getRowHeight();
System.out.println(col + "x" + row);
Point cell = new Point(col, row);
if (cells.contains(cell)) {
cells.remove(cell);
} else {
cells.add(cell);
}
repaint();
}
}
});
}
@Override
public Dimension getPreferredSize() {
return map == null ? new Dimension(200, 200) : new Dimension(map.getWidth(), map.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (map != null) {
Graphics2D g2d = (Graphics2D) g.create();
int xOffset = getXOffset();
int yOffset = getYOffset();
int x = xOffset;
int y = yOffset;
g2d.drawImage(map, x, y, this);
int colWidth = getColumnWidth();
int rowHeight = map.getHeight() / GRID_COUNT;
g2d.setColor(new Color(255, 0, 0, 128));
for (Point p : cells) {
x = xOffset + (p.x * colWidth);
y = yOffset + (p.y * rowHeight);
g2d.fillRect(x, y, colWidth, rowHeight);
}
g2d.setColor(new Color(128, 128, 128, 64));
for (int col = 0; col < GRID_COUNT; col++) {
x = xOffset + (col * colWidth);
g2d.drawLine(x, yOffset, x, yOffset + map.getHeight());
}
for (int row = 0; row < GRID_COUNT; row++) {
y = yOffset + (row * rowHeight);
g2d.drawLine(xOffset, y, xOffset + map.getWidth(), y);
}
g2d.drawRect(xOffset, yOffset, map.getWidth(), map.getHeight());
g2d.dispose();
}
}
protected int getColumnWidth() {
return map == null ? 0 : map.getWidth() / GRID_COUNT;
}
protected int getRowHeight() {
return map == null ? 0 : map.getHeight() / GRID_COUNT;
}
protected int getXOffset() {
return map == null ? 0 : (getWidth() - map.getWidth()) / 2;
}
protected int getYOffset() {
return map == null ? 0 : (getHeight() - map.getHeight()) / 2;
}
protected Rectangle getMapBounds() {
return map == null ? new Rectangle(0, 0, 0, 0) : new Rectangle(getXOffset(), getYOffset(), map.getWidth(), map.getHeight());
}
}
}