java - 从另一个 Java 函数调用 Graphics 函数

标签 java swing function graphics

我正在尝试获取一个按钮来调用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 方法,然后使用字段状态来决定绘制什么。

例如,您的字段可以是像 int 这样简单的东西,每次选择错误的字母时,它就会递增或递减,然后 PaintComponent 使用该 int 来决定绘制哪些 body 部位以及绘制多少个 body 部位。

查看教程,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/

相关文章:

Java:SelectionKey.attach() 损坏了吗?

java - 在 Canvas 中显示 VLCJ 播放器

c - 为什么我会得到这些随机值?

parameters - 如何从另一个 ns 设置一个 ns 中的值?

java - 如何在java类中使用tomee.xml中声明的数据源

java - @ActiveProfiles 不适用于 AbstractTestNGSpringContextTests

java - 混合来自 SWT 和 Swing 的框架 (JFrame)

javascript - 单击另一个元素时单击元素

java - 在java中绘制一个三角形

java - Swing/SwingWorker 初学者的问题