java - DNA 到 RNA 的转换 Java Swing : Why aren't my JButtons working?

标签 java swing jbutton

我正在开发一个简单的工具,用户可以输入他们的字符串或 RNA 或 DNA,然后单击一个按钮,然后将其转录。当我单击转录或反向转录 JButton 时,什么也没有发生!请帮忙!任何方向、提示或帮助都会很棒!谢谢你!这是我的代码:

import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.*;

public class TranslationGUI extends javax.swing.JFrame implements ActionListener
{
    public static final int WIDTH = 1500;
    public static final int HEIGHT = 500;

    TextArea DNATextArea, RNATextArea, proteinTextArea;
    JButton transcribe, translate, reverseTranscribe;
    String DNA;
    String RNA;

/** Creates new form TranslationGUI */
public TranslationGUI() 
{
    super("Transcription and Translation Tool");
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout());     

    JPanel DNAPanel = new JPanel();
    DNAPanel.setPreferredSize(new Dimension(440,400));
    DNAPanel.add(new JLabel("DNA Sequence"));
    TextArea DNATextArea = new TextArea();
    DNAPanel.add(DNATextArea);
    DNATextArea.setEditable(true);
    DNAPanel.add(new JLabel("DNA (deoxyribonucleic acid)"));
    JButton transcribe = new JButton();
    DNAPanel.add(new JButton("Transcribe"));
    transcribe.addActionListener(this);
    add(DNAPanel, BorderLayout.WEST);
    DNAPanel.setBackground(Color.WHITE);

    JPanel RNAPanel = new JPanel();
    RNAPanel.setPreferredSize(new Dimension(440,400));
    RNAPanel.add(new JLabel("RNA Sequence"));
    TextArea RNATextArea = new TextArea();
    RNATextArea.setEditable(true);
    RNAPanel.add(RNATextArea);
    RNAPanel.add(new JLabel("RNA (ribonucleic acid)"));
    JButton translate = new JButton();
    RNAPanel.add(new JButton("Translate"));
    translate.addActionListener(this);
    JButton reverseTranscribe = new JButton();
    RNAPanel.add(new JButton("Reverse Transcribe"));
    reverseTranscribe.addActionListener(this);
    add(RNAPanel, BorderLayout.CENTER);
    RNAPanel.setBackground(Color.LIGHT_GRAY);

    JPanel proteinPanel = new JPanel();
    proteinPanel.setPreferredSize(new Dimension(440,400));
    proteinPanel.add(new JLabel("Protein Sequence"));
    TextArea proteinTextArea = new TextArea();
    proteinPanel.add(proteinTextArea);
    proteinPanel.add(new JLabel("Protein"));
    add(proteinPanel, BorderLayout.EAST);
    proteinPanel.setBackground(Color.WHITE);

    pack();
}

public void actionPerformed(ActionEvent event) 
{
    if(event.getSource()== transcribe)
    {
        DNATranscription();
    }
    else if(event.getSource()== reverseTranscribe)
    {
        RNATranscription();
    }
else if(event.getSource()== translate)
    {   
        Translate();
}
}

public void DNATranscription()
{   
    String DNA = DNATextArea.getText();
    char[] reverse = new char[DNA.length()];
    for (int i = 0; i < reverse.length; i++) 
    {
        switch(DNA.charAt(i)) 
        {
            case 'A': reverse[i] = 'T';break;
            case 'T': reverse[i] = 'A';break;
            case 'C': reverse[i] = 'G';break;
            case 'G': reverse[i] = 'C';break;
            default: 
                System.out.println("Not a DNA code");
        }
    }
    DNA = new String(reverse);
    RNATextArea.append(DNA);
}

public void RNATranscription()
{   
    String RNA = RNATextArea.getText();
    char[] reverse = new char[RNA.length()];
    for (int i = 0; i < reverse.length; i++) 
    {
        switch(RNA.charAt(i)) 
        {
            case 'T': reverse[i] = 'A';break;
            case 'A': reverse[i] = 'T';break;
            case 'G': reverse[i] = 'C';break;
            case 'C': reverse[i] = 'G';break;
            default: 
                System.out.println("Not a RNA code");
        }
    }
    RNA = new String(reverse);
    DNATextArea.append(RNA);
}

public void Translate()
{
    //do something
}

private static final String[][] CODON_AMINO = //table for the codon
                                           //that corresponds to a protein
    {
     {"att", "i"}, {"atc", "i"}, {"ata", "i"}, {"ctt", "l"},
     {"ctc", "l"}, {"cta", "l"}, {"ctg", "l"}, {"tta", "l"},
     {"ttg", "l"}, {"gtt", "v"}, {"gtc", "v"}, {"gta", "v"},
     {"gtg", "v"}, {"ttt", "f"}, {"ttc", "f"}, {"atg", "m"},
     {"tgt", "c"}, {"tgc", "c"}, {"gct", "a"}, {"gcc", "a"},
     {"gca", "a"}, {"gcg", "a"}, {"ggt", "g"}, {"ggc", "g"},
     {"gga", "g"}, {"ggg", "g"}, {"cct", "p"}, {"ccc", "p"},
     {"cca", "p"}, {"ccg", "p"}, {"act", "t"}, {"acc", "t"},
     {"aca", "t"}, {"acg", "t"}, {"tct", "s"}, {"tcc", "s"},
     {"tca", "s"}, {"tcg", "s"}, {"agt", "s"}, {"agc", "s"},
     {"tat", "y"}, {"tac", "y"}, {"tgg", "w"}, {"caa", "q"},
     {"cag", "q"}, {"aat", "n"}, {"aac", "n"}, {"cat", "h"},
     {"cac", "h"}, {"gaa", "e"}, {"gag", "e"}, {"gat", "d"},
     {"gac", "d"}, {"aaa", "k"}, {"aag", "k"}, {"cgt", "r"},
     {"cgc", "r"}, {"cga", "r"}, {"cgg", "r"}, {"aga", "r"},
     {"agg", "r"}
    };

/** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

    java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    setBounds((screenSize.width-416)/2, (screenSize.height-338)/2, 416, 338);
}// </editor-fold>                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {

    TranslationGUI frame = new TranslationGUI();
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(TranslationGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TranslationGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(TranslationGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TranslationGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new TranslationGUI().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
// End of variables declaration                   

}

最佳答案

你的问题是你正在隐藏变量。

您在类中声明了 JButton 变量,但随后在构造函数中重新声明了它们,因此不会引用附加监听器的 JButton 对象通过类中的 JButton 变量。因此,当您的 actionPerformed 方法检查按下的 JButton 是否是转录 JButton 时,它不匹配,事实上 transcribe 实际上是此时为 null(测试它并查看)。解决方案:不要在构造函数中重新声明变量。

换句话说,在你的构造函数中更改:

// this creates a new transcribe variable inside of the 
// constructor, assigns it a JButton object, but the variable
// is only visible inside of the constructor.
JButton transcribe = new JButton();

对此:

// this creates a new JButton object and assigns it to the 
// class transcribe variable.
transcribe = new JButton();

编辑
哎呀,您正在向 GUI 添加另一个 JButton - 不要这样做!

DNAPanel.add(new JButton("Transcribe")); // ??

添加您在其上方创建的 JButton。

DNAPanel.add(transcribe); // add the button created just above.

例如,

  translate = new JButton("Translate"); // give button a title
  RNAPanel.add(translate);
  translate.addActionListener(this);

这几乎就像您非常努力地确保类中的 JButton 变量不起作用一样。我当然是在开玩笑,但你用两种不同的方式阻止它,这是我以前从未见过的——而且我以为我已经看到了一切。

关于java - DNA 到 RNA 的转换 Java Swing : Why aren't my JButtons working?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8495592/

相关文章:

java - JPanel 已添加到切换按钮单击上的其他 Jpanel 上

java - android studio 每 X 秒自动刷新线程中的数据 json url

java - 如何用方向键移动矩形?

java - 使用 java swing 在 ImageIcon 代理中显示动画 gif

java - 如何在某些按钮上添加图像图标?

JButton 选择/ActionPerformed 的 Java Swing 问题

java - 构造一个返回由输入决定的原始数据类型的 Java 方法?

java - Nashorn 加载 javascript 时出错 - 版本问题?

java - 每当我选择任何单选按钮时,它都会自动选择最后一个按钮,我该怎么办?

java - JTable多选不使用键盘只使用鼠标