标题:JAVA 的GUI问题
只看楼主
高小辉
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-11-24
结帖率:0
 问题点数:0 回复次数:6 
JAVA 的GUI问题
1》为什么只有上下拉窗口面板2区的文本框才能显示出来?
2》为什么键盘事件不执行?
3》编程要求在图片里,编程在下面已写好,希望各位大佬改改.
package javaapplication17;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Administrator
 */
public class W2 extends JFrame implements ActionListener, KeyListener,FocusListener{

    JTextField t1;
    JButton b1;
    ActionListener t1t;
    JTextField a[];
    JPanel p2 ;
    JLabel j1;
    int m;
    String str;
    String s1;
    W2() {
        j1=new JLabel("拼写单词");
        t1 = new JTextField(15);
       // t1.setText(null);
        //t1.addFocusListener(this);
        
        b1 = new JButton("确定");
     // b1.addFocusListener(this);
        JPanel p1 = new JPanel();
        p2 = new JPanel();
        p1.add(t1);
        p1.add(b1);
        p2.add(j1);
        add(p1, BorderLayout.NORTH);
        add(p2, BorderLayout.CENTER);
        setVisible(true);
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        t1.addActionListener(this);
      b1.addActionListener(this);
       // p2.removeAll();//p2每次刷新布局
    }
    public void actionPerformed(ActionEvent e) {
        if((JButtone.getSource()==b1){//文本框1得到监听*/
        str = t1.getText();//得到文本框字符串
        m = str.length();
         
        getNew(str);
        set2(get2(m));//
         a[0].addFocusListener(this);
    }
    }

    public void set2(JTextField[] a){
p2.removeAll();
//面板2上加文本框
        for (int i = 0; i < a.length; i++) {
            a[i].setVisible(true);
            p2.add(a[i]);
            t1.setText(null);
            //a[0].addFocusListener(this);
        }
    }

    public void getNew(String s) {//打乱字符串
        String s1 = "";
        StringBuffer s2 = new StringBuffer(s);
        int m = s2.length();
        for (int k = 0; k < m; k++) {
            int t3 = (int) (Math.random() * s2.length());
            char c = s2.charAt(t3);
            s1 = s1 + c;//字符串并置
            s2 = s2.deleteCharAt(t3);
        }
        this.s1 = s1;
        

    }

    public JTextField[] get2(int n) {//文本框设置
        a = new JTextField[n];
        for (int i = 0; i < n; i++) {
            a[i]=new JTextField(2);
            a[i].setText("" + s1.charAt(i));//setText参数类型为string,但charAt返回字符型,并置空的形成string
            a[i].setEditable(false);
            a[i].addKeyListener(this);
            //a[0].addFocusListener(this);

        }
        return a;
    }
    public void focusGained(FocusEvent e){
        
    }
    public void  focusLost(FocusEvent e){
        
    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {
        JTextField c=(JTextField)(e.getSource());
        int d=-1;
        if((e.getKeyChar()+"").equals("←"+"")){
            for(int k=0;k<a.length;k++){
                if(a[0]==c){//第一个文本框不能再往左了,判别那个地方获得焦点;
                    d=k;
                    break;
                }
            }
            if(d!=0){
                String str=a[d].getText();
                a[d].setText(a[d-1].getText());
                a[d-1].setText(str);
                a[d-1].requestFocus();
            }
            
        }else if((e.getKeyChar()+"").equals("→"+"")){
             for(int k=0;k<a.length;k++){
                if(a[0]==c){//第一个文本框不能再往左了,判别那个地方获得焦点;
                    d=k;
                    break;
                }
             }
              if(d!=a.length-1){
                String str=a[d].getText();
                a[d].setText(a[d+1].getText());
                a[d+1].setText(str);
                a[d+1].requestFocus();
            }
               
            
        }
        
        String s4="";
        for(int i=0;i<a.length;i++){
            String s5=a[i].getText();
            s4=s4+s5;
            
        }
        if(s4.equals(s1)){
            j1.setText("成功了");
            for(int k=0;k<a.length;k++){
                a[k].removeKeyListener(this);
                  a[k].removeFocusListener(this);
             t1.requestFocus();
            t1.setText(null);
           
                  
            }
            t1.requestFocus();
            t1.setText(null);
         
            
        }
        
        
        
        

    }

    public void keyPressed(KeyEvent e) {

    }
}
收到的鲜花
  • 静水且流深2018-01-19 00:36 送鲜花  20朵   附言:代码命名有意义,正常缩进,流程清晰才是有 ...
搜索更多相关主题的帖子: str public int String this 
2018-01-15 16:25
高小辉
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-11-24
得分:0 
2018-01-15 16:26
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
简单说一下,考虑集合使用,对于界面控件元素的改变刷新操作是有必要的
再者不一定非得监听器,又不是全部都用,考虑适配器
代码习惯不太好,命名,结构等等,注释已经很难救过来了
今天有空的话帮你做一下吧

剑栈风樯各苦辛,别时冰雪到时春
2018-01-16 07:55
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
怎么说呢,重写一遍可能打击了你的自信心,你可以暂时参考一下。
有什么问题提出,我会答复。至于你写的,我得花时间消化一下。
不介意的话,等我下一贴的修改
程序代码:
package com.huawei.business.testGui;

import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class Test {
    private static JFrame jframe = new JFrame();
    private static JTextField jtf = new JTextField();
    private static JButton btnOk = new JButton("确定");
    private static JPanel jpCen = new JPanel();
    private static JLabel lblRes = new JLabel("");
    private static List<JTextField> jtfs = new ArrayList<JTextField>();
    public void start() {
        jframe.setVisible(true);
        jframe.setAlwaysOnTop(true);
        jframe.setSize(400, 400);
        jframe.setResizable(false);
        jframe.setDefaultCloseOperation(3);
        Box boxH = Box.createHorizontalBox();
        boxH.add(new JLabel("输入单词"));
        boxH.add(jtf);
        boxH.add(btnOk);
        jframe.add(boxH, "North");
        jframe.add(jpCen, "Center");
        jframe.add(lblRes, "South");
        jtf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_ENTER){
                    handle();
                }
            }
        });
        btnOk.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                handle();
            }
        });
    }
    static int indexOfGaind;
    void handle() {
        String[] array = jtf.getText().trim().split("");
        List<String> list = Arrays.asList(array);
        Collections.shuffle(list);
        jpCen.removeAll();
        jtfs.clear();
        for(String content : list){
            JTextField txt=new JTextField(content);
            txt.setEditable(false);
            txt.addFocusListener(focusAdapter);
            jtfs.add(txt);
            jpCen.add(txt);
        }
        jpCen.updateUI();
        checkEquals();
    }
    private void checkEquals() {
        StringBuilder sb=new StringBuilder();
        for(JTextField jtf:jtfs){
            sb.append(jtf.getText().trim());
        }
        if(sb.toString().equals(jtf.getText().trim())){
            lblRes.setText("恭喜你,成功了!");
        }else{
            lblRes.setText("");
        }
    }
    FocusAdapter focusAdapter = new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            indexOfGaind = jtfs.indexOf(e.getSource());
            jtfs.get(indexOfGaind).addKeyListener(keyAdapter);
        }
        public void focusLost(FocusEvent e) {
            
            int index = jtfs.indexOf(e.getSource());
            jtfs.get(index).removeKeyListener(keyAdapter);
        }
    };
    KeyAdapter keyAdapter = new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            boolean isChange=false;
            if(e.getKeyCode() == KeyEvent.VK_LEFT) {
                if(indexOfGaind > 0){
                    JTextField tmpField = jtfs.get(indexOfGaind);
                    jtfs.set(indexOfGaind, jtfs.get(indexOfGaind-1));
                    jtfs.set(indexOfGaind-1, tmpField);
                    isChange=true;
                }
            }else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
                if(indexOfGaind<jtfs.size() - 1) {
                    JTextField tmpField = jtfs.get(indexOfGaind);
                    jtfs.set(indexOfGaind, jtfs.get(indexOfGaind+1));
                    jtfs.set(indexOfGaind+1, tmpField);
                    isChange=true;
                }
            }
            if(isChange){
                jpCen.removeAll();
                for(JTextField txt : jtfs) {
                    jpCen.add(txt);
                }
                jpCen.updateUI();
                checkEquals();
            }
        };
    };
    public static void main(String[] args) {
        new Test().start();
    }
}

加油!

剑栈风樯各苦辛,别时冰雪到时春
2018-01-16 20:03
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
不好意思,有点忙,先回答你的问题吧。
1》为什么只有上下拉窗口面板2区的文本框才能显示出来?
    jframe 的size没有设置
2》为什么键盘事件不执行?
    首先检查监听有没有体现,可以通过打印,弹窗等多角度测试
3》编程要求在图片里,编程在下面已写好,希望各位大佬改改.
    以上代码为覆写

代码修改还是你自己来吧,
建议代码之前理一下流程,把涉及到的子任务细化,规范化,才有助于后续工作的进展。
祝你修改顺利吧。

剑栈风樯各苦辛,别时冰雪到时春
2018-01-16 20:14
高小辉
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-11-24
得分:0 
回复 5楼 林月儿
你好,1.看了你写的代码,我发现你多了个update语句,然后上网查了查,在我那里加了个repaint();语句发现文本框正常了,原来的问题是本来输入5个单词,确认后,再输出4个单词,再确认还有五个框,,这里问题出现了,为什么removeall();没有移除完原来的5个文本框;加上repaint();反而可以呢?
2.repaint()不是绘图用的吗,难道也有刷新组件的功能吗?能否说下repain();什么作用呢?我把可以运行的代码发给你,你可以试一下?
3。我有一个想法,就是获得焦点后会改变颜色,focusGained()方法内加了个下面这段代码程序好像死机了一样,这段代码发给你时会注释掉,你可以将注释去掉试一下。
最后非常感谢你,百忙之中看我写的代码。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Administrator
 */
public class W2 extends JFrame implements ActionListener, KeyListener, FocusListener {

    JTextField t1;
    JButton b1, b2, b3;

    JTextField a[];
    JPanel p2;
    JLabel j1;
    int m;
    String str;
    String s1;

    W2() {
        j1 = new JLabel("拼写单词");
        t1 = new JTextField(15);

        b2 = new JButton("重新输入");
        b1 = new JButton("确定");
        b3 = new JButton("拼写检查");
        // b1.addFocusListener(this);
        JPanel p1 = new JPanel();
        p2 = new JPanel();
        p1.add(j1);
        p1.add(t1);
        p1.add(b1);
        p1.add(b2);
        p1.add(b3);

        add(p1, BorderLayout.NORTH);
        add(p2, BorderLayout.CENTER);
        setVisible(true);

        setDefaultCloseOperation(HIDE_ON_CLOSE);
        t1.addActionListener(this);
        b1.addActionListener(this);
        j1.addFocusListener(this);
        b3.addActionListener(this);
        b2.addActionListener(this);

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == b1 || e.getSource() == t1) {
            str = t1.getText();
            m = str.length();

            getNew(str);
            set2(get2(m));

        }
        if (e.getSource() == b2) {
            t1.setText(null);
            j1.setText("拼写单词");

        }
        if (e.getSource() == b3) {
            String s4 = "";//??
            for (int i = 0; i < a.length; i++) {
                String s5 = a[i].getText();
                s4 = s4 + s5;

            }

            if (str.equals(s4)) {

                j1.setText("成功了");

            }
        }

    }

    public void set2(JTextField[] a) {

        p2.removeAll();
        p2.repaint();

        for (int i = 0; i < a.length; i++) {

            p2.add(a[i]);

        }

        validate();
    }

    public void getNew(String s) {
        String s1 = "";
        StringBuffer s2 = new StringBuffer(s);
        int m = s2.length();
        for (int k = 0; k < m; k++) {
            int t3 = (int) (Math.random() * s2.length());
            char c = s2.charAt(t3);
            s1 = s1 + c;
            s2 = s2.deleteCharAt(t3);
        }
        this.s1 = s1;

    }

    public JTextField[] get2(int n) {

        a = new JTextField[n];
        for (int i = 0; i < n; i++) {
            a[i] = new JTextField(2);
            a[i].setText("" + s1.charAt(i));
            a[i].setEditable(false);
            a[i].addFocusListener(this);
            a[i].addKeyListener(this);

        }
        return a;
    }

    public void focusGained(FocusEvent e) {
       /* for(int k=0;k<a.length;k++){
            if(a[k].requestFocusInWindow()){
                a[k].setBackground(Color.cyan);
               
            }
        }*/

    }

    public void focusLost(FocusEvent e) {

    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {

    }

    public void keyPressed(KeyEvent e) {

        int d = -1;
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            for (int k = 0; k < a.length; k++) {
                if (a[k] == (JTextField) e.getSource()) {
                    d = k;
                    break;
                }
            }
            if (d != 0) {
                String h = a[d].getText();
                a[d].setText(a[d - 1].getText());
                a[d - 1].setText(h);
                a[d - 1].requestFocus();
            }

        } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            for (int k = 0; k < a.length; k++) {
                if (a[k] == (JTextField) e.getSource()) {
                    d = k;
                    break;
                }
            }
            if (d != a.length - 1) {
                String str = a[d].getText();
                a[d].setText(a[d + 1].getText());
                a[d + 1].setText(str);
                a[d + 1].requestFocus();
            }
            validate();

        }

    }

}
2018-01-17 16:59
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
[quote]以下是引用高小辉在2018-1-17 16:59:13的发言:

你好,1.看了你写的代码,我发现你多了个update语句,然后上网查了查,在我那里加了个repaint();语句发现文本框正常了,原来的问题是本来输入5个单词,确认后,再输出4个单词,再确认还有五个框,,这里问题出现了,为什么removeall();没有移除完原来的5个文本框;加上repaint();反而可以呢?
2.repaint()不是绘图用的吗,难道也有刷新组件的功能吗?能否说下repain();什么作用呢?我把可以运行的代码发给你,你可以试一下?
3。我有一个想法,就是获得焦点后会改变颜色,focusGained()方法内加了个下面这段代码程序好像死机了一样,这段代码发给你时会注释掉,你可以将注释去掉试一下。
最后非常感谢你,百忙之中看我写的代码。


1.是updateUI吧,至于repaint,可以说明没有问题很好啊。
2.repaint是你用的,怎么用了半天还不清楚作用呢?查查api的说明应该有解释说明
3.周末有空帮你看吧,今天追剧很晚了

这个swing呢,实际项目用的应该不多。有点偏冷门,不用研究太深入,有时间学学基础什么的就更好了.

剑栈风樯各苦辛,别时冰雪到时春
2018-01-18 00:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-484258-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.281897 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved