我在JList中遇到NullPointerException,但异常的来源似乎是Swing事件处理代码.JList有一个键监听器,当按下Delete键时,它将删除所选项.仅在列表中的第二个和所有后续删除上抛出异常.关于如何修复它的任何想法?
重现问题的示例代码和生成的异常包括在下面:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JList;
public class Sample {
public static void main(String[] args) {
final JFrame frame = new JFrame();
final Vector<String> list = new Vector<String>();
for (int i = 0; i < 5; ++i) {
list.add("String " + i);
}
final JList listView = new JList(list);
listView.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
list.remove(listView.getSelectedIndex());
listView.updateUI();
}
}
@Override
public void keyReleased(KeyEvent e) { } …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法将变量或字符串或任何东西传递给JButton的匿名actionlistener(或显式actionlistener).这是我有的:
public class Tool {
...
public static void addDialog() {
JButton addButton = new JButton( "Add" );
JTextField entry = new JTextField( "Entry Text", 20 );
...
addButton.addActionListener( new ActionListener( ) {
public void actionPerformed( ActionEvent e )
{
System.out.println( entry.getText() );
}
});
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在我只是声明entry
是一个全局变量,但我讨厌这样做的方式.还有更好的选择吗?
我有以下,
GridLayout layout = new GridLayout(4, 0);
Run Code Online (Sandbox Code Playgroud)
如果我有5
项目,这将创建2
列,其中第一个包含3
行,第二个包含2
行.这不是我想要的,也不是我所期望的.我希望第一列包含4
行,第二列包含1
行.
为什么这个布局管理器不符合每列我想要的行数?或者更好的是,我如何让这个布局经理尊重这个?
你好我是affineTransform
java 新手.我想用它来剪切一些我以后要使用的GUI.现在我只想测试一个示例代码,但我无法解释它的输出.这是代码
package main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainClass{
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
jf.getContentPane().add(new MyCanvas());
jf.setSize(600, 600);
jf.setVisible(true);
}
}
class Left extends JPanel {
Left(){
setPreferredSize(new Dimension(450,450));
setBorder(BorderFactory.createLineBorder(Color.green));
setBackground(Color.gray);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = new AffineTransform();
g2.setTransform(at);
g2.drawRect(getWidth()/2 - 10, getHeight()/2 - 10, 20, …
Run Code Online (Sandbox Code Playgroud) 我如何编写一个鼠标监听器,它会对按下JFrame
某个特定对象上的任何对象作出反应?
这是我的老鼠听众 -
class mouse extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
yearLabel.setText("nu");
}
}
Run Code Online (Sandbox Code Playgroud) 我得到的Document
对象JTextPane
,包含方法remove
,但具体的字符数textPane.getDocument().remove(begin,end)
.我想删除整个第一行.
我想设置文本上方和下方一个JButton
的图标.目前,为了实现这一点,我覆盖了布局管理器并使用了三个JLabel
实例(即2个用于文本,1个用于图标).但这似乎是一个肮脏的解决方案.
有更直接的方法吗?
注意 -
我不是在寻找多线解决方案,我正在寻找一种多标签解决方案.虽然这条是指它作为一个多行的解决方案,它实际上似乎是指一个多标签解决方案.
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public final class JButtonDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.add(new JMultiLabelButton());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true); …
Run Code Online (Sandbox Code Playgroud) 我想说我有一个List.在for循环中修改list的项目没有问题:
for (int i = 0; i < list.size(); i++) { list.get(i).setId(i); }
Run Code Online (Sandbox Code Playgroud)
但是我有一个SortedSet而不是list.我怎么能用它呢?谢谢
如果我这样做,
final class FooButton extends JButton{
FooButton(){
super("Foo");
addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
// do stuff
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我让this
引用隐含地逃脱了吗?
通过add
和手动交换组件后remove
,我调用validate()
容器.根据文件,
validate方法用于使容器再次布置其子组件.在显示容器后修改此容器的子组件(添加到容器中或从容器中删除,或更改布局相关信息)时,应调用它.
短语" 再次布置其子组件 "让我觉得容器会相应调整大小,但事实并非如此.相反,在调用之后validate()
,我还需要调用pack()
以查看其所有子组件.
为什么是这样?难道我做错了什么?
java ×10
swing ×8
jbutton ×2
awt ×1
constructor ×1
containers ×1
grid-layout ×1
iterator ×1
java-2d ×1
jlabel ×1
jlist ×1
jtextpane ×1
resize ×1
sortedset ×1