我已经在我的代码中创建了一个GoInvisible类,它实现了一个鼠标监听器,我尝试使用鼠标按下和鼠标释放的方法让我的框架变得透明,然后在按下并释放时恢复正常框架上的按钮。我正在一个内部类中调用这些方法,这个方法实现了一个处理按钮事件的动作监听器,但由于某种原因,当我运行应用程序时,框架永远不会出现。
这是框架代码;
public class FNAFrame extends JFrame {
public FNAFrame()
{
super ("FNA Comments Generator");
setLayout(new BorderLayout());
setResizable(false);
TextFrame comps = new TextFrame();
add(comps);
pack();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
//
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
{
ex.printStackTrace();
}
new FNAFrame();
}
});
}
} // end of class FNA Frame
这是组件类;
public class TextFrame extends JPanel
{
private JButton Go_Shadow;
public TextFrame()
{
super(new GridBagLayout());
setPreferredSize(new Dimension(300,200));
setBackground(Color.white);
init();
} // end of class constructor
private void init()
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10,10,10,10);
// button to display date in textarea
Go_Shadow = new JButton("Shadow");
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
add(Go_Shadow, gbc);
// adding listeners to components
// registering all components with their respective listeners
CompHandler compHandler = new CompHandler();
Go_Shadow.addActionListener(compHandler);
}
// class to handle text fields
private class CompHandler implements ActionListener
{
private MouseEvent me;
@Override
public void actionPerformed(ActionEvent e)
{
Object button_command = e.getActionCommand();
if (button_command.equals("Go_Shadow"))
{
GoInvisible invisy = new GoInvisible();
invisy.mousePressed(me);
invisy.mouseReleased(me);
}
}
} // end component handler class
} // end of TextFrame class
这是鼠标监听器类
public class GoInvisible implements MouseListener {
FNAFrame Parentpane = new FNAFrame();
TextFrame compPanel = new TextFrame();
@Override
public void mouseClicked(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mousePressed(MouseEvent e) {
Parentpane.setUndecorated(true);
Parentpane.setOpacity(0.5f);
compPanel.setOpaque(true);
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseReleased(MouseEvent e) {
Parentpane.setUndecorated(false);
compPanel.setOpaque(true);
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseEntered(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseExited(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
答案 0 :(得分:1)
有一系列问题......
throw new UnsupportedOperationException("Not supported yet.");
,这些会导致问题并阻止你的代码执行actionCommand
不是"Go_Shadow"
,它将是按钮的文本,除非您另外指定。MouseListener
或ActionListener
添加,而应该监控ButtonModel
的状态FNAFrame
处理程序中创建TextFrame
和GoInvisible
的新实例,这些实例与屏幕上实际存在的实例无关!相反,您应该监控ButtonModel
的状态,例如......
Go_Shadow.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
JFrame window = (JFrame) SwingUtilities.getWindowAncestor(TextFrame.this);
if (model.isArmed() && model.isPressed()) {
window.setUndecorated(true);
window.setOpacity(0.5f);
setOpaque(false);
} else if (model.isArmed() && !model.isPressed()) {
setOpaque(true);
window.setOpacity(1f);
window.setUndecorated(false);
}
}
});
但是,您仍然会发现这会导致问题,因为框架边框的状态一旦显示就无法更改
更好的解决方案可能是使用JToggleButton
,例如
public class TextFrame extends JPanel {
private JToggleButton Go_Shadow;
public TextFrame() {
super(new GridBagLayout());
setPreferredSize(new Dimension(300, 200));
setBackground(Color.white);
init();
} // end of class constructor
private void init() {
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
// button to display date in textarea
Go_Shadow = new JToggleButton("Shadow");
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
add(Go_Shadow, gbc);
// adding listeners to components
// registering all components with their respective listeners
Go_Shadow.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFrame window = (JFrame) SwingUtilities.getWindowAncestor(TextFrame.this);
Point location = window.getLocation();
if (Go_Shadow.isSelected()) {
window.dispose();
window.setUndecorated(true);
window.setOpacity(0.5f);
setOpaque(false);
} else {
window.dispose();
window.setOpacity(1f);
window.setUndecorated(false);
setOpaque(true);
}
window.setLocation(location);
window.setVisible(true);
}
});
}
} // end of TextFrame class
您可能希望阅读Code Conventions for the Java TM Programming Language,这样可以让人们更轻松地阅读您的代码并让您阅读其他代码