我正在尝试获取一个按钮来调用java中的图形函数,该函数将带走剩余的生命并为绞刑吏游戏绘制适当的部分。除了绘图之外,一切都正常。我相信这是因为我调用该函数的方式,但我不确定。谢谢
代码按钮:
if(TempText == Label.getText()){
lives--;
panel2.paintComponent();
if (lives == 0){
JOptionPane.showMessageDialog(null,"You Lose");
buttonA.setEnabled(false);
buttonB.setEnabled(false);
buttonC.setEnabled(false);
buttonD.setEnabled(false);
buttonE.setEnabled(false);
buttonF.setEnabled(false);
buttonG.setEnabled(false);
buttonH.setEnabled(false);
buttonI.setEnabled(false);
buttonJ.setEnabled(false);
buttonK.setEnabled(false);
buttonL.setEnabled(false);
buttonM.setEnabled(false);
buttonN.setEnabled(false);
buttonO.setEnabled(false);
buttonP.setEnabled(false);
buttonQ.setEnabled(false);
buttonR.setEnabled(false);
buttonS.setEnabled(false);
buttonT.setEnabled(false);
buttonU.setEnabled(false);
buttonV.setEnabled(false);
buttonW.setEnabled(false);
buttonX.setEnabled(false);
buttonY.setEnabled(false);
buttonZ.setEnabled(false);
}
}
代码绘制
class ColorPanel extends JPanel {
final HangMan man = new HangMan();
Graphics g;
public void paintComponent(){
super.paintComponent(g);
this.setBackground(Color.WHITE);
if(man.lives == 5){
g.drawOval(175, 100, 50, 50);
}
if(man.lives == 4){
g.drawLine(200, 200, 200, 150);
}
if(man.lives == 3){
g.drawLine(200, 200, 250, 250);
}
if(man.lives == 2){
g.drawLine(200, 200, 150, 250);
}
if(man.lives == 1){
g.drawLine(150, 150, 200, 175);
}
if(man.lives == 0){
g.drawLine(250, 150, 200, 175);
}
g.drawLine(100, 300, 100, 50);
g.drawLine(200, 50, 100, 50);
g.drawLine(200, 100, 200, 50);
g.drawOval(50, 300, 100, 50);
}
}
错误
在 ColorPanel.paintComponent(HangMan.java:2573)
在 HangMan$3.actionPerformed(HangMan.java:445)
最佳答案
您几乎不应该直接调用paintComponent或super.paintComponent,并且您不应该使用看似空的Graphics对象。坦率地说,我很惊讶你没有得到 NullPointerException
与该代码。事实上,也许您是 - 您从未向我们展示足够的异常堆栈跟踪,让我们知道您遇到的错误类型(建议 - 显示整个异常堆栈跟踪)。
相反,让您按下按钮更改您的drawig JPanek的状态,更改其关键字段之一,然后调用repaint()
在绘图 JPanel 上。 JPanel 的绘图内部 protected void paintComponent(Graphics g)
方法,调用 super 方法,然后使用字段状态来决定绘制什么。
查看教程,Lesson: Performing Custom Painting查看您希望如何在 GUI 中绘制的详细信息。
我想赞同 EddyG 的建议——使用 JButton 数组或 HashMap<Character, JButton>
帮助更好地组织您的 GUI 代码。这样您就可以在一个简单的 for 循环中创建 JButton,从 int (char c =
开始循环。一个; c <= 'Z'; c++) {...}
。这将使您的代码更加紧凑,更容易理解,从而更容易调试。
例如,
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
@SuppressWarnings("serial")
public class LetterSelectionGrid extends JPanel {
public static final String SELECTED_LETTER = "selected letter";
private Map<Character, AbstractButton> buttonMap = new HashMap<>();
public LetterSelectionGrid() {
setBorder(BorderFactory.createTitledBorder("Select Letters"));
ButtonListener buttonListener = new ButtonListener();
setLayout(new GridLayout(3, 0));
for (char c = 'A'; c <= 'Z'; c++) {
String text = String.valueOf(c);
JButton button = new JButton(text);
button.addActionListener(buttonListener);
add(button); // add to GUI
buttonMap.put(c, button);
}
}
private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
AbstractButton btn = (AbstractButton) e.getSource();
char selectedChar = e.getActionCommand().charAt(0);
btn.setEnabled(false);
firePropertyChange(SELECTED_LETTER, null, selectedChar);
}
}
public void setAllEnabled(boolean enabled) {
for (AbstractButton btn : buttonMap.values()) {
btn.setEnabled(enabled);
}
}
private static void createAndShowGui() {
final LetterSelectionGrid letterSelectionGrid = new LetterSelectionGrid();
JButton resetButton = new JButton(new AbstractAction("Reset") {
@Override
public void actionPerformed(ActionEvent e) {
letterSelectionGrid.setAllEnabled(true);
}
});
JPanel southPanel = new JPanel();
southPanel.add(resetButton);
letterSelectionGrid.addPropertyChangeListener(LetterSelectionGrid.SELECTED_LETTER, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Selected Letter is: " + evt.getNewValue());
}
});
JFrame frame = new JFrame("ButtonGrid");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(letterSelectionGrid);
frame.getContentPane().add(southPanel, BorderLayout.PAGE_END);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
关于java - 从另一个 Java 函数调用 Graphics 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393522/