frillybob frillybob - 3 months ago 24
Java Question

Swing unwritten field warning (Java)

I have findBugs installed and get a bug warning in the actionPerformed method at if statement

if (source == this.temp)


The warning says there is an unwritten field. The program still compiles but hangs when I click on the button called temp.

I thought I had already correctly initialized that field. Can someone direct me on where I messed up please? Thanks

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

import components.simplereader.SimpleReader;
import components.simplereader.SimpleReader1L;

/**
* View class.
*
* @author Redacted
*/
@SuppressWarnings("serial")
public final class PasswordManagerView1 extends JFrame
implements PasswordManagerView {

private JButton temp;

/**
* controller.
*/
private PasswordManagerController controller;

/**
* Jpanel.
*/

/**
* Useful constants.
*/
private Dimension maxSize;
private JTabbedPane tabbedPane;

/**
* Constructor.
*/
public PasswordManagerView1() {
super("Password Manager");
JTabbedPane tabbedPane = new JTabbedPane();
//Initial JPanel creation
tabbedPane.setBorder(new EmptyBorder(5, 5, 5, 5));
//tabbedPane.setLayout(new BorderLayout(0, 0));
this.maxSize = new Dimension(700, 300);
tabbedPane.setPreferredSize(this.maxSize);
this.getContentPane().add(tabbedPane);

//Initial JTabbedPane creation

//Tab creation
JComponent panel1 = this.makeTextPanel("temp1");
ImageIcon icon = new ImageIcon("lock-icon.png");
tabbedPane.addTab("Add Password", icon, panel1,
"Adds a password to the vault");
JComponent panel2 = this.makeTextPanel("temp2");
tabbedPane.addTab("Delete Password", icon, panel2,
"Deletes a password from the vault");
JComponent panel3 = this.makeTextPanel("temp3");
tabbedPane.addTab("Password Vault", icon, panel3,
"View the passwords in the vault");
JComponent panel4 = this.makeInfoPanel();
tabbedPane.addTab("Info/Settings", icon, panel4,
"View settings and program info");
JButton temp = new JButton("Hey");
panel1.add(temp);
temp.addActionListener(this);
//Pack up
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}

private JComponent makeTextPanel(String text) {
JPanel panel = new JPanel();
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
}

private JComponent makeInfoPanel() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 1));
StringBuilder toPrint = new StringBuilder();
SimpleReader in = new SimpleReader1L("data/Notice.txt");
while (!in.atEOS()) {
toPrint.append(in.nextLine() + "\n");
}
String toPrintString = toPrint.toString();
JTextArea noticeText = new JTextArea(toPrintString);
noticeText.setEditable(false);
JScrollPane noticeTextScroll = new JScrollPane(noticeText);
panel.add(noticeTextScroll);
in.close();
return panel;

}

@Override
public void registerObserver(PasswordManagerController controller) {
this.controller = controller;
}

@Override
public void actionPerformed(ActionEvent event) {
//Wait cursor
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

//What button was pressed
Object source = event.getSource();
if (source == this.temp) {
this.controller.processTestEvent();
}
}

Answer

In the constructor you have this bit of code:

JButton temp = new JButton("Hey");
panel1.add(temp);

It defines a local temp variable which shadows the member - remove JButton so that it uses the class member:

temp = new JButton("Hey");
panel1.add(temp);
Comments