|
|
|
@ -5,37 +5,33 @@ import com.fr.design.event.UIObserver;
|
|
|
|
|
import com.fr.design.event.UIObserverListener; |
|
|
|
|
import com.fr.design.gui.ilable.UILabel; |
|
|
|
|
import com.fr.design.gui.itextfield.UITextField; |
|
|
|
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
|
|
|
import org.jetbrains.annotations.NotNull; |
|
|
|
|
|
|
|
|
|
import javax.swing.BorderFactory; |
|
|
|
|
import javax.swing.JComponent; |
|
|
|
|
import javax.swing.JFrame; |
|
|
|
|
import javax.swing.JPanel; |
|
|
|
|
import javax.swing.JTable; |
|
|
|
|
import javax.swing.event.CellEditorListener; |
|
|
|
|
import javax.swing.event.ChangeEvent; |
|
|
|
|
import javax.swing.event.ChangeListener; |
|
|
|
|
import javax.swing.plaf.TableUI; |
|
|
|
|
import javax.swing.table.TableCellEditor; |
|
|
|
|
import javax.swing.table.TableCellRenderer; |
|
|
|
|
import javax.swing.table.TableColumn; |
|
|
|
|
import java.awt.AWTEvent; |
|
|
|
|
import java.awt.BorderLayout; |
|
|
|
|
import java.awt.Component; |
|
|
|
|
import java.awt.Point; |
|
|
|
|
import java.awt.Rectangle; |
|
|
|
|
import java.awt.Toolkit; |
|
|
|
|
import java.awt.event.AWTEventListener; |
|
|
|
|
import java.awt.event.FocusAdapter; |
|
|
|
|
import java.awt.event.FocusEvent; |
|
|
|
|
import java.awt.event.MouseEvent; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
public class UITable extends JTable implements UIObserver { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final int OFF_LEFT = 10; |
|
|
|
|
private static final int STEP = 2; |
|
|
|
|
private static final int DEFAULT_ROW_HEIGHT = 20; |
|
|
|
|
private UIObserverListener uiObserverListener; |
|
|
|
|
UITableEditor editor; |
|
|
|
@ -54,8 +50,6 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
initComponents(); |
|
|
|
|
iniListener(); |
|
|
|
|
shouldResponseAwt = false; |
|
|
|
|
// kunsnat: 屏蔽: 对于下拉框, 无法等待选择结果之后在stop..
|
|
|
|
|
// Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public UITable(int columnSize, boolean needAWTEventListener) { |
|
|
|
@ -63,7 +57,12 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
shouldResponseAwt = needAWTEventListener; |
|
|
|
|
isEditingStopped = true; |
|
|
|
|
if (needAWTEventListener) { |
|
|
|
|
Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); |
|
|
|
|
Toolkit.getDefaultToolkit().addAWTEventListener(event -> { |
|
|
|
|
if (!UITable.this.isShowing()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
doSomeInAll(event); |
|
|
|
|
}, AWTEvent.MOUSE_EVENT_MASK); |
|
|
|
|
this.addFocusListener(new FocusAdapter() { |
|
|
|
|
public void focusGained(FocusEvent e) { |
|
|
|
|
isEditingStopped = false; |
|
|
|
@ -87,20 +86,16 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 传入列表数据 |
|
|
|
|
* |
|
|
|
|
* @param values 数据 |
|
|
|
|
*/ |
|
|
|
|
public void populateBean(List<Object[]> values) { |
|
|
|
|
getTableDataModel().populateBean(values); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private AWTEventListener awt = new AWTEventListener() { |
|
|
|
|
public void eventDispatched(AWTEvent event) { |
|
|
|
|
if (!UITable.this.isShowing()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
doSomeInAll(event); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
private void doSomeInAll(AWTEvent event) { |
|
|
|
|
Rectangle bounds = new Rectangle(getLocationOnScreen().x, getLocationOnScreen().y, getWidth(), getHeight()); |
|
|
|
|
if (event instanceof MouseEvent) { |
|
|
|
@ -118,6 +113,11 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取模型中数据 |
|
|
|
|
* |
|
|
|
|
* @return 数据 |
|
|
|
|
*/ |
|
|
|
|
public List<Object[]> updateBean() { |
|
|
|
|
return getTableDataModel().updateBean(); |
|
|
|
|
} |
|
|
|
@ -223,7 +223,7 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
setBackground(UIConstants.NORMAL_BACKGROUND); |
|
|
|
|
setDefaultEditor(UITable.class, editor); |
|
|
|
|
setDefaultRenderer(UITable.class, new UITableRender()); |
|
|
|
|
// setUI(getUI());
|
|
|
|
|
setUI(getUI()); |
|
|
|
|
|
|
|
|
|
TableColumn deleteTableColumn = new TableColumn(getTableDataModel().getColumnCount()); |
|
|
|
|
deleteTableColumn.setCellEditor(null); |
|
|
|
@ -243,14 +243,11 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
|
|
|
|
|
private void iniListener() { |
|
|
|
|
if (shouldResponseChangeListener()) { |
|
|
|
|
this.addChangeListener(new ChangeListener() { |
|
|
|
|
@Override |
|
|
|
|
public void stateChanged(ChangeEvent e) { |
|
|
|
|
if (uiObserverListener == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
uiObserverListener.doChange(); |
|
|
|
|
this.addChangeListener(e -> { |
|
|
|
|
if (uiObserverListener == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
uiObserverListener.doChange(); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -295,6 +292,11 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
return new UITableUI(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public TableCellEditor getDefaultEditor(Class<?> columnClass) { |
|
|
|
|
return super.getDefaultEditor(UITable.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) { |
|
|
|
|
// 处理null的情况用于创建时未指定数据结构的情况
|
|
|
|
@ -342,7 +344,7 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
repaint(); |
|
|
|
|
Object[] listeners = listenerList.getListenerList(); |
|
|
|
|
|
|
|
|
|
for (int i = listeners.length - 2; i >= 0; i -= 2) { |
|
|
|
|
for (int i = listeners.length - STEP; i >= 0; i -= STEP) { |
|
|
|
|
if (listeners[i] == ChangeListener.class) { |
|
|
|
|
((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); |
|
|
|
|
} |
|
|
|
@ -366,31 +368,4 @@ public class UITable extends JTable implements UIObserver {
|
|
|
|
|
public void removeChangeListener(ChangeListener l) { |
|
|
|
|
this.listenerList.remove(ChangeListener.class, l); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 测试主函数 |
|
|
|
|
* |
|
|
|
|
* @param args 参数 |
|
|
|
|
*/ |
|
|
|
|
public static void main(String... args) { |
|
|
|
|
JFrame jf = new JFrame("test"); |
|
|
|
|
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
|
|
|
JPanel content = (JPanel) jf.getContentPane(); |
|
|
|
|
content.setLayout(new BorderLayout()); |
|
|
|
|
List<Object[]> data = new ArrayList<Object[]>(); |
|
|
|
|
String[] a = {"1", "11"}; |
|
|
|
|
String[] b = {"2", "22"}; |
|
|
|
|
String[] c = {"3", "33"}; |
|
|
|
|
String[] d = {"4", "44"}; |
|
|
|
|
data.add(a); |
|
|
|
|
data.add(b); |
|
|
|
|
data.add(c); |
|
|
|
|
data.add(d); |
|
|
|
|
UITable pane = new UITable(2); |
|
|
|
|
pane.populateBean(data); |
|
|
|
|
content.add(pane, BorderLayout.CENTER); |
|
|
|
|
GUICoreUtils.centerWindow(jf); |
|
|
|
|
jf.setSize(400, 400); |
|
|
|
|
jf.setVisible(true); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|