JTextField java?
我的任务: 创建一个应用程序,显示10个步骤的刽子手图形。该图形应可通过文本字段和滑块(在0-10范围内)进行控制,以便进行测试。该文本框会在值更改后立即更新图形,并且不会等到按下Enter键。如果在文本字段中输入了无效值,则会显示错误消息而不是图形(使用方法JTextField java?,java,swing,jtextfield,Java,Swing,Jtextfield,我的任务: 创建一个应用程序,显示10个步骤的刽子手图形。该图形应可通过文本字段和滑块(在0-10范围内)进行控制,以便进行测试。该文本框会在值更改后立即更新图形,并且不会等到按下Enter键。如果在文本字段中输入了无效值,则会显示错误消息而不是图形(使用方法drawStringtext也可以“绘制”),如果没有值,则图形应保持为空 在我的程序中,JSlider上的图形更改工作正常,但通过文本字段的输入不会导致任何更改,当输入错误的值时,我尝试了检查,但没有显示任何内容。我不明白出了什么问题,因
drawString
text也可以“绘制”),如果没有值,则图形应保持为空
在我的程序中,JSlider
上的图形更改工作正常,但通过文本字段的输入不会导致任何更改,当输入错误的值时,我尝试了检查,但没有显示任何内容。我不明白出了什么问题,因为JTextField
方法与JSlider
相同
我已经在下面列出了这两个类的源代码
头等舱:
进口,包装
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();
}
}
二等舱:
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;
}
}
JTextField读取工作正常,但问题是首先要检查滑块的值,因此如果滑块if check为true,则该方法会短路。为了证明它工作正常,将滑块一直向右移动,然后在JTextField中输入1或2 如果这是我的项目,我想测试这种效果,我会从绘画方法中获取所有逻辑,并允许我的控制器更改观察到的类的状态值,调用
repaint()
,然后根据该状态绘制图像
例如,类似这样的情况:
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());
}
}
@SuppressWarnings(“串行”)
类HangmanPanel2扩展了JPanel{
私人刽子手模型;
private List images=ImageCreator.getImages();
公共机库面板2(机库模型){
this.model=模型;
}
@凌驾
公共维度getPreferredSize(){
如果(isPreferredSizeSet()| | images.size()==0){
返回super.getPreferredSize();
}
intw=images.get(0).getWidth(this);
inth=images.get(0).getHeight(this);
返回新尺寸(w,h);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 drawImage(images.get(model.getValue()),0,0,this);
}
}
类ImageCreator{
专用静态最终int W=284;
专用静态最终int H=425;
专用静态最终颜色基础颜色=新颜色(205、133、63);
公共静态列表getImages(){
列表图像=新的ArrayList();
BuffereImage img=新的BuffereImage(W,H,BuffereImage.TYPE_INT_ARGB);
添加(createImageCopy(img));
Graphics2D g2=img.createGraphics();
g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
g2.设置颜色(基本颜色);
int xArc=W/20;
int-yArc=H-H/5;
内弧宽度=W/2;
int-arcHeight=H/5;
g2.填充弧(xArc,yArc,弧宽,arcHeight,0,180);
添加(createImageCopy(img));
// -----------------------------------------
g2.设置颜色(颜色为黑色);
int x1Line=xArc+arcWidth/2;
int x2Line=x1Line;
int y1Line=yArc;
int y2Line=H/6;
g2.拉线(x1Line、y1Line、x2Line、y2Line);
添加(createImageCopy(img));
// -----------------------------------------
int x3Line=x1Line;
int x4Line=x3Line+(W/3)+20;
int y3Line=y2Line;
int y4Line=y3Line;
g2.拉线(X3线、Y3线、X4线、Y4线);
添加(createImageCopy(img));
// -----------------------------------------
int x5Line=x4Line;
int x6Line=x5Line;
int y5Line=y4Line;
int y6Line=y5Line+W/5;//+60
g2.拉线(x5Line、y5Line、x6Line、y6Line);
// -----------------------------------------
g2.setColor(新颜色(255、221、204));
g2.椭圆形(x6Line-H/20、y6Line、H/10、,
H/10);/-25,…,50,50
添加(createImageCopy(img));
// -----------------------------------------
g2.setColor(颜色为蓝色);
g2.圆角((内部)((内部)x6Line-H/14.7),
(int)(y6Line+H/10.41),(int)(H/7.14),,
(int)(H/4.16));//34、48、70、120
添加(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.设置颜色(颜色为黑色);
g2.拉线(x7Line、y7Line、x8Line、y8Line);
添加(createImageCopy(img));
// -----------------------------------------
int x9Line=x7Line-(int)(H/9.43);/53
int x10Line=x9Line-(int)(H/14.28);/35
int y9Line=y7Line;
int Y10线=Y8线;
g2.拉线(x9Line、y9Line、x10Line、y10Line);
添加(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.拉线(X11线、Y11线、X12线、Y12线);
添加(createImageCopy(img));
// -----------------------------------------
int x13Line=x9Line;
int x14Line=x10Line;
int Y13线=Y11线;
int y14Line=y12Line;
g2.拉线(x13Line、y13Line、x14Line、y14Line);
添加(createImageCopy(img));
g2.dispose();
返回图像;
}
专用静态图像createImageCopy(BuffereImage img){
int w=img.getWidth();
int h=img.getHeight(
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);
}
}
@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);
}
}
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;
}
}