首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JTextField java?

JTextField java?
EN

Stack Overflow用户
提问于 2018-09-14 02:57:43
回答 1查看 42关注 0票数 1

我的任务:

创建一个应用程序,该应用程序显示10个步骤的Hangman图形。出于测试目的,此图形应可通过文本字段和滑块(在0-10范围内)进行控制。值一更改,文本框就会更新图形,而不是等到按Enter键。如果在文本字段中输入了无效值,则会显示一条错误消息,而不是图形(使用方法drawString text也可以“绘制”),如果没有值,则图形应该保持为空。

在我的程序中,更改JSlider上的图形可以正常工作,但是通过文本字段输入不会导致任何更改,并且在输入不正确的值时进行检查,我尝试了一下,但什么也没有显示。我不明白出了什么问题,因为JTextField方法和JSlider是一样的……

我已经把两个类的源代码放在下面了。

头等舱:

导入,打包...

代码语言:javascript
复制
public class HangmanFrame extends JFrame{

public HangmanFrame(){

    super("Hangman");
    HangmanPanel panel = new HangmanPanel();
    JPanel mainPanel = new JPanel();
    this.add(mainPanel);
    mainPanel.setLayout(new BorderLayout());

    JTextField t = new JTextField();
    t.getDocument().addDocumentListener(new DocumentListener(){

        @Override
        public void changedUpdate(DocumentEvent arg0) {
            try{
                Integer.parseInt(t.getText());
            }
            catch(NumberFormatException ex){
                System.out.println(ex.getMessage());
            }
            panel.repaint();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            try{
                Integer.parseInt(t.getText());
            }
            catch(NumberFormatException ex){
                System.out.println(ex.getMessage());
            }
            panel.repaint();

        }

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            try{
                Integer.parseInt(t.getText());
            }
            catch(NumberFormatException ex){
                System.out.println(ex.getMessage());
            }
            panel.repaint();
        }
    });

    JSlider s = new JSlider(JSlider.HORIZONTAL, 0, 10, 0);

    s.addChangeListener(new ChangeListener(){

        @Override
        public void stateChanged(ChangeEvent arg0) {
            panel.repaint();
        }

    });

    panel.setSlider(s);
    panel.setTextField(t);
    mainPanel.add(panel, BorderLayout.CENTER);
    mainPanel.add(s, BorderLayout.PAGE_END);
    mainPanel.add(t, BorderLayout.PAGE_START);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.pack();
    this.setSize(300,500);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
}

public static void main(String[] args) {
    new HangmanFrame();
}

}

第二类:

代码语言:javascript
复制
public class HangmanPanel extends JPanel {

    private JSlider slider;
    private JTextField field; //Height 500, Width 300

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        int sliderValue = slider.getValue();
        String fieldValue = field.getText();
        //int fieldInt = Integer.parseInt(fieldValue);

        g.drawLine(0, super.getWidth() + 99, super.getHeight(), super.getWidth() + 99); 

        if(sliderValue == 0 || fieldValue.equals("0")){
            return;
        }

        g.setColor(new Color(205,133,63));
        int xArc = this.getWidth() / 20;
        int yArc = this.getHeight() - this.getHeight() / 5;
        int arcWidth = this.getWidth() / 2;
        int arcHeight = this.getHeight() / 5;

        g.fillArc(xArc, yArc, arcWidth, arcHeight, 0, 180);

        if(sliderValue == 1 || fieldValue.equals("1")){
            return;
        }

        g.setColor(Color.BLACK);
        int x1Line = xArc + arcWidth / 2;
        int x2Line = x1Line;
        int y1Line = yArc;
        int y2Line = this.getHeight() / 6;

        g.drawLine(x1Line, y1Line, x2Line, y2Line);

        if(sliderValue == 2 || fieldValue.equals("2")){
            return;
        }

        int x3Line = x1Line;
        int x4Line = x3Line + (this.getWidth() / 3) + 20;
        int y3Line = y2Line;
        int y4Line = y3Line;

        g.drawLine(x3Line, y3Line, x4Line, y4Line);

        if(sliderValue == 3 || fieldValue.equals("3")){
            return;
        }

        int x5Line = x4Line;
        int x6Line = x5Line;
        int y5Line = y4Line;
        int y6Line = y5Line + this.getWidth() / 5; // + 60

        g.drawLine(x5Line, y5Line, x6Line, y6Line);

        if(sliderValue == 4 || fieldValue.equals("4")){
            return;
        }

        g.setColor(new Color(255, 221, 204));
        g.fillOval(x6Line - this.getHeight() / 20, y6Line, this.getHeight() / 10, this.getHeight() / 10); // -25, ...,50, 50

        if(sliderValue == 5 || fieldValue.equals("5")){
            return;
        }

        g.setColor(Color.BLUE);
        g.fillOval((int) ((int) x6Line - this.getHeight() / 14.7) , (int) (y6Line + this.getHeight() / 10.41), (int)(this.getHeight() / 7.14), (int)(this.getHeight() / 4.16)); // 34, 48, 70, 120                        

        if(sliderValue == 6 || fieldValue.equals("6")){
            return;
        }

        int x7Line = x6Line + (int)(this.getHeight() / 17.85); // 28
        int x8Line = x7Line + (int)(this.getHeight() / 12.5); // 40
        int y7Line = y6Line + (int)(this.getHeight() / 7.14); // 70
        int y8Line = y7Line - (int)(this.getHeight() / 14.28); // 35

        g.setColor(Color.BLACK);
        g.drawLine(x7Line, y7Line, x8Line, y8Line);

        if(sliderValue == 7 || fieldValue.equals("7")){
            return;
        }

        int x9Line = x7Line - (int)(this.getHeight() / 9.43); // 53
        int x10Line = x9Line - (int)(this.getHeight() / 14.28); // 35
        int y9Line = y7Line;
        int y10Line = y8Line;

        g.drawLine(x9Line, y9Line, x10Line, y10Line);

        if(sliderValue == 8 || fieldValue.equals("8")){
            return;
        }

        int x11Line = x7Line;
        int x12Line = x8Line;
        int y11Line = y7Line + (int)(this.getHeight() / 6.66); // 75
        int y12Line = y8Line + (int)(this.getHeight() / 3.33); // 150

        g.drawLine(x11Line, y11Line, x12Line, y12Line);

        if(sliderValue == 9 || fieldValue.equals("9")){
            return;
        }

        int x13Line = x9Line;
        int x14Line = x10Line;
        int y13Line = y11Line;
        int y14Line = y12Line;

        g.drawLine(x13Line, y13Line, x14Line, y14Line);

    }

    public void setSlider(JSlider slider){
        this.slider = slider;
    }

    public void setTextField(JTextField field){
        this.field = field;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-14 03:09:31

您的JTextField读数可以正常工作,但问题是您首先要检查滑块的值,因此如果滑块if check为真,该方法就会短路。要证明它工作正常,请将滑块一直移动到右侧,然后在JTextField中输入1或2。

如果这是我的项目,并且我想测试这种效果,我将从绘制方法中提取所有逻辑,而不是允许我的控制器更改观察到的类的状态值,调用repaint(),然后基于该状态绘制图像。

例如,如下所示:

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

@SuppressWarnings("serial")
public class HangmanGUI2 extends JPanel {
    private HangmanModel model = new HangmanModel();
    private HangmanPanel2 panel2 = new HangmanPanel2(model);
    private JSlider slider = new JSlider(0, HangmanModel.MAX_VALUE, 0);
    private JTextField textField = new JTextField(10);

    public HangmanGUI2() {
        textField.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                updateModel(e);
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                updateModel(e);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                updateModel(e);
            }

            private void updateModel(DocumentEvent e) {
                Document doc = e.getDocument();
                int length = doc.getLength();
                try {
                    String text = doc.getText(0, length);
                    int value = Integer.parseInt(text.trim());
                    setModelValue(value);
                } catch (BadLocationException e1) {
                    e1.printStackTrace();
                } catch (NumberFormatException e1) {
                    // Do Nothing
                }
            }
        });

        slider.setMajorTickSpacing(1);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.addChangeListener(e -> {
            int value = slider.getValue();
            setModelValue(value);
        });

        setLayout(new BorderLayout());
        add(panel2);
        add(textField, BorderLayout.PAGE_START);
        add(slider, BorderLayout.PAGE_END);

//        new Timer(1000, e -> {
//            model.increment();
//            repaint();
//        }).start();  
    }

    protected void setModelValue(int value) {
        model.setValue(value);
        repaint();
    }

    private static void createAndShowGui() {
        HangmanGUI2 mainPanel = new HangmanGUI2();

        JFrame frame = new JFrame("HangmanGUI2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

代码语言:javascript
复制
class HangmanModel {
    public static final int MAX_VALUE = 9;
    private int value = 0;

    public int getValue() {
        return value;
    }

    public void increment() {
        setValue(getValue() + 1);
    }

    public void setValue(int value) {
        this.value = Math.min(value, MAX_VALUE);
        this.value = Math.max(this.value, 0);
    }    

}

代码语言:javascript
复制
@SuppressWarnings("serial")
class HangmanPanel2 extends JPanel {
    private HangmanModel model;
    private List<Image> images = ImageCreator.getImages();

    public HangmanPanel2(HangmanModel model) {
        this.model = model;
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet() || images.size() == 0) {
            return super.getPreferredSize();
        }
        int w = images.get(0).getWidth(this);
        int h = images.get(0).getHeight(this);
        return new Dimension(w, h);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(images.get(model.getValue()), 0, 0, this);
    }
}

代码语言:javascript
复制
class ImageCreator {
    private static final int W = 284;
    private static final int H = 425;
    private static final Color BASE_COLOR = new Color(205, 133, 63);

    public static List<Image> getImages() {
        List<Image> images = new ArrayList<>();
        BufferedImage img = new BufferedImage(W, H, BufferedImage.TYPE_INT_ARGB);
        images.add(createImageCopy(img));
        Graphics2D g2 = img.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2.setColor(BASE_COLOR);
        int xArc = W / 20;
        int yArc = H - H / 5;
        int arcWidth = W / 2;
        int arcHeight = H / 5;

        g2.fillArc(xArc, yArc, arcWidth, arcHeight, 0, 180);


        images.add(createImageCopy(img));

        // -----------------------------------------

        g2.setColor(Color.BLACK);
        int x1Line = xArc + arcWidth / 2;
        int x2Line = x1Line;
        int y1Line = yArc;
        int y2Line = H / 6;

        g2.drawLine(x1Line, y1Line, x2Line, y2Line);

        images.add(createImageCopy(img));

        // -----------------------------------------

        int x3Line = x1Line;
        int x4Line = x3Line + (W / 3) + 20;
        int y3Line = y2Line;
        int y4Line = y3Line;

        g2.drawLine(x3Line, y3Line, x4Line, y4Line);

        images.add(createImageCopy(img));

        // -----------------------------------------

        int x5Line = x4Line;
        int x6Line = x5Line;
        int y5Line = y4Line;
        int y6Line = y5Line + W / 5; // + 60

        g2.drawLine(x5Line, y5Line, x6Line, y6Line);

        // -----------------------------------------

        g2.setColor(new Color(255, 221, 204));
        g2.fillOval(x6Line - H / 20, y6Line, H / 10,
                H / 10); // -25, ...,50, 50

        images.add(createImageCopy(img));

        // -----------------------------------------

        g2.setColor(Color.BLUE);
        g2.fillOval((int) ((int) x6Line - H / 14.7),
                (int) (y6Line + H / 10.41), (int) (H / 7.14),
                (int) (H / 4.16)); // 34, 48, 70, 120

        images.add(createImageCopy(img));

        // -----------------------------------------

        int x7Line = x6Line + (int) (H / 17.85); // 28
        int x8Line = x7Line + (int) (H / 12.5); // 40
        int y7Line = y6Line + (int) (H / 7.14); // 70
        int y8Line = y7Line - (int) (H / 14.28); // 35

        g2.setColor(Color.BLACK);
        g2.drawLine(x7Line, y7Line, x8Line, y8Line);

        images.add(createImageCopy(img));

        // -----------------------------------------

        int x9Line = x7Line - (int) (H / 9.43); // 53
        int x10Line = x9Line - (int) (H / 14.28); // 35
        int y9Line = y7Line;
        int y10Line = y8Line;

        g2.drawLine(x9Line, y9Line, x10Line, y10Line);

        images.add(createImageCopy(img));

        // -----------------------------------------

        int x11Line = x7Line;
        int x12Line = x8Line;
        int y11Line = y7Line + (int) (H / 6.66); // 75
        int y12Line = y8Line + (int) (H / 3.33); // 150

        g2.drawLine(x11Line, y11Line, x12Line, y12Line);

        images.add(createImageCopy(img));

        // -----------------------------------------

        int x13Line = x9Line;
        int x14Line = x10Line;
        int y13Line = y11Line;
        int y14Line = y12Line;

        g2.drawLine(x13Line, y13Line, x14Line, y14Line);
        images.add(createImageCopy(img));

        g2.dispose();
        return images;
    }

    private static Image createImageCopy(BufferedImage img) {
        int w = img.getWidth();
        int h = img.getHeight();
        BufferedImage img2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics g = img2.getGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return img2;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52320156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档