我正在讨论一个侧面项目的一些想法,我想创建一个使用Java swing的GUI,它看起来不像来自Windows95。我正在努力的一个想法是使用JLabel作为按钮而不是标准的JButton。这样我就可以根据需要自定义悬停,拖动和移动效果。
对MouseAdapter class
的研究应该允许我做我想做的一切,不幸的是我在实现悬停效果方面遇到了一些麻烦,因为JLabel
似乎没有更新。我已经尝试通过调用frame.update(getGraphics());
直接更新框架,但这似乎不像我认为的那样工作。
我可以就如何正确更新标签获得一些建议。
注意:这只是一个没有努力有效组织代码的例子
public class Window extends JFrame {
/**
*
*/
private static final long serialVersionUID = 5259700796854880162L;
private JTextField textField;
private JLabel lblNewLabel;
static Window frame;
int i = 0;
public Window() {
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(null);
lblNewLabel = new JLabel("New label");
lblNewLabel.setBackground(Color.LIGHT_GRAY);
lblNewLabel.setBounds(137, 38, 114, 70);
panel.add(lblNewLabel);
lblNewLabel.addMouseListener(new LabelAdapter());
textField = new JTextField();
textField.setBounds(122, 119, 86, 20);
panel.add(textField);
textField.setColumns(10);
}
private class LabelAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
textField.setText(String.valueOf(i));
i++;
}
@Override
public void mouseEntered(MouseEvent e) {
lblNewLabel.setBackground(Color.CYAN);
}
@Override
public void mouseExited(MouseEvent e) {
lblNewLabel.setBackground(Color.LIGHT_GRAY);
}
}
/**
* @param args
*/
public static void main(String[] args) {
frame = new Window();
frame.setSize(900, 700);
frame.setVisible(true);
}
}
答案 0 :(得分:5)
Window
是awt.Window
的保留名称,请将此名称更改为例如MyWindow
JPanel
已实施FlowLayout
,您无法使用NullLayout
使用built_in LayoutManager,然后在JFrame.pack()
之前使用JFrame.setVisible
在屏幕上调整大小
JLabel
是透明的,请使用JLabel.setOpaque(true);
如果Backgroung Color
作为Mouse over/hover
中的最后一个代码行JLabel.repaint()
,则mouse_event
无法刷新repaint()
JLabel API
{{1}} 1}}
答案 1 :(得分:3)
除了mKorbel的回答......
我不知道为什么你会这么努力,当你真的可以让按钮看起来像一个标签。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class NotALabel {
public static void main(String[] args) {
new NotALabel();
}
public NotALabel() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
final JButton btn = new JButton("Am I label or a button?");
btn.setContentAreaFilled(false);
btn.setBorderPainted(false);
btn.setFocusPainted(false);
btn.setOpaque(true);
btn.getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
ButtonModel model = (ButtonModel) e.getSource();
if (model.isRollover()) {
btn.setBackground(Color.CYAN);
} else {
btn.setBackground(null);
}
}
});
btn.addActionListener(new ActionListener() {
private int count = 0;
@Override
public void actionPerformed(ActionEvent e) {
count++;
((JButton) e.getSource()).setText("I'm a super button!! Or label...");
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(btn);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
您还应该考虑尝试Setting the look and feel甚至可能Modifying the look and feel
答案 2 :(得分:0)
您可以使用 MouseListener 实现此目的。 Here is the sample progrma.看看。