我正在使用单行JTabel并附加了MouseAdapter.表模型填充了一些随机值.右键单击表格后,将出现带有多个JMenuItems的JPopupMenu.视觉工件开始显示弹出窗口的一部分是否在某个点附着到它所连接的面板之外.有趣的是,如果弹出窗口没有附加很多项目,这似乎只会发生.任何超过七个项目的弹出窗口一直在为我工作.
仅在使用Java 1.8.0_112-b15的Windows 10 64位上进行了测试.
为什么会发生这种情况并且有解决方法?
public class PopupTest {
private static final int NUM_POPUP_ITEMS = 3;
private JFrame frame = new JFrame();
private JPanel panel = new JPanel();
private TableModel model = new TableModel();
private JTable table = new JTable();
public static void main(String[] a) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PopupTest();
}
});
}
public PopupTest() {
panel.setLayout(new BorderLayout());
panel.add(table, BorderLayout.CENTER);
panel.setPreferredSize(new Dimension(400, 500));
table.setModel(model);
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent event) { …Run Code Online (Sandbox Code Playgroud) 我有一个FormGroup具有多个嵌套组和控件的。其中大多数包含验证器,例如Validators.required. 每当用户单击提交按钮时,我都会递归地循环遍历表单,以确保触发每个验证器并且每个控件都有效。这是通过将每个控件标记为 Touched 并调用 来完成的control.updateValueAndValidity()。
然而,这会触发valueChanged和statusChanged事件。我已向该事件添加了订阅者statusChanged,该事件应该处理任何错误,但我不希望触发,valueChanged因为该值没有更改。
是否可以在statusChanged不开火的情况下手动开火valueChanged?传递{ emitEvent: false }到updateValueAndValidity将阻止这两个事件被触发。
public ngOnInit(): void {
const form = this.formBuilder.group({
'name': ['', Validators.required],
'address': this.formBuilder.group({
'street': ['', Validators.required],
'number': ['', Validators.required]
})
});
form.valueChanges.subscribe(() => console.log('Should not fire'));
form.statusChanges.subscribe(() => console.log('Should fire'));
this.validateForm(form);
console.log(form.valid);
}
private validateForm(control: AbstractControl): void {
if (control instanceof FormControl) {
control.markAsTouched();
control.markAsDirty();
control.updateValueAndValidity();
} else …Run Code Online (Sandbox Code Playgroud) 我不久前开始编程,目前我需要一种方法来生成一个数组,其中包含前一个字符之后的字符。它应该以 0 处的“A”开头,然后是“1”处的 B 等。困难的部分是使其在“Z”之后是“AA”。
我想出了什么:
public static String[] charArray(int length)
{
String[] res = new String[length];
for(int i = 0; i < length; i++)
{
String name = "";
int colNumber = i;
while(colNumber > 0)
{
char c = (char) ('A' + (colNumber % 26));
name = c + name;
colNumber = colNumber / 26;
}
res[i] = name;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
这对于字母表的前 26 个字母来说效果很好,但它会生成“... Y, Z, BA, BB, BC...”而不是“... Y, Z, AA, AB, AC...” ”
怎么了?或者有没有更有效或更简单的方法来做到这一点? …