W mojej aplikacji znajduje się JTable
ze zmiennymi kolumnami nagłówka. Zwykle po przesunięciu kursora nad nagłówek tabeli w celu zmiany rozmiaru ikona kursora zmienia się, aby zmienić wielkość strzałki, na przykład < ->.Ikona kursora nie zmienia się po wyzwoleniu metody setCursor
Jednak w poniższym scenariuszu sytuacja wygląda inaczej.
Występuje akcja przycisku w tym samym Frame
, a podczas wykonywanej akcji ustawiam kursor na ikonę zajętości i zmieniam ją z powrotem na domyślny kursor po zakończeniu akcji, używając metody Container.setCurosr(Cursor cursor)
.
Czasami po przesunięciu kursora nad nagłówkiem tabeli zmiany rozmiaru, po naciśnięciu przycisku ikona kursora nie zmienia się, aby zmienić wielkość strzałki, kursor nie zmienia się wcale.
Czy można to uznać za błąd w Java Swing lub czy istnieje rozwiązanie tego problemu?
Aktualizacja: Przykładowy kod dołączony
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ColumnResizeIconTest extends JFrame {
JScrollPane scrollPane;
JTable table;
JButton button;
public ColumnResizeIconTest() {
setLayout(new BorderLayout());
addComponents();
setSize(300,300);
}
private void addComponents() {
addButton();
addTable();
}
private void addButton() {
button = new JButton("Click Me");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
setWaitCursor();
for(int i=0; i<2000; i++) {
System.out.print(i);
}
setDefaultCursor();
}
});
add(button, BorderLayout.NORTH);
}
private void addTable() {
scrollPane = new JScrollPane(createTable());
add(scrollPane, BorderLayout.CENTER);
}
private JTable createTable() {
Object[][] cellData = { { "1-1", "1-2","1-3" }, { "2-1", "2-2", "2-3" }, { "3-1", "3-2", "3-3" } };
String[] columnNames = { "column1", "column2", "column3" };
table = new JTable(cellData, columnNames);
return table;
}
private void setWaitCursor() {
Container container = getContentPane();
setWaitCursor(container);
}
private void setWaitCursor(Container container) {
for(int iCount = 0; iCount < container.getComponentCount(); iCount++) {
Component child = (Component) container.getComponent(iCount);
if(child instanceof Container) {
setWaitCursor((Container) child);
} else {
child.setCursor(new Cursor(Cursor.WAIT_CURSOR));
}
}
container.setCursor(new Cursor(Cursor.WAIT_CURSOR));
}
private void setDefaultCursor() {
Container container = getContentPane();
setDefaultCursor(container);
}
private void setDefaultCursor(Container container) {
for(int iCount = 0; iCount < container.getComponentCount(); iCount++) {
Component child = (Component) container.getComponent(iCount);
if(child instanceof Container) {
setDefaultCursor((Container) child);
} else {
child.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
container.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
public static void main(String[] argv) throws Exception {
ColumnResizeIconTest test = new ColumnResizeIconTest();
test.setVisible(true);
}
}
Kliknij na przycisk kilka razy i próbować zmienić rozmiar kolumny tabeli. Kursor utknął z domyślnym kursorem.
jaka wersja java na jakiej platformie? –
1) Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). 2) * "Czy można to uznać za błąd ..." * Prawdopodobnie. * ".. w Java Swing .." * Prawdopodobnie nie. * ".. lub czy istnieje rozwiązanie tego problemu?" * Napraw swój kod (prawdopodobnie). –
@Andrew Thompson jakże prawdopodobnie dzisiaj, uzgodniony z 4 prawdopodobnie z twojego 3. – mKorbel