【发布时间】:2015-12-10 16:50:26
【问题描述】:
我是 java Swing 的新手,这是我的第一个问题,所以请原谅我的错误。我正在尝试制作一个 JPanel(容器),它有一个 GridBagLayout 并拥有一些用作按钮的较小 Jpanel。我为每个小型 JPanel 设置了一个 mouseEntered 侦听器,该侦听器将背景颜色更改为进入的颜色。 是否可以在该面板的行和列上更改颜色? 例如,如果我在 Cell(4,3) 中输入鼠标,我想要单元格的背景 (4,0) 和 (0,3) 也将被更改。
这是我的容器:
public class CellPane extends JPanel{
private List<Cell> cellList;
private final GridBagConstraints gbc;
private Cell cell;
private int counter;
public CellPane(){
this.setLayout(new GridBagLayout());
gbc = new GridBagConstraints();
cellList = new ArrayList<>();
counter = 0;
for(int row=0;row<15;row++)
for(int col=0;col<31;col++){
gbc.gridx = col;
gbc.gridy = row;
cell = new Cell(col ,row);
Border border = null;
if (row < 14) {
if (col < 30) {
border = new MatteBorder(1, 1, 0, 0, new Color(153,204,204));
} else {
border = new MatteBorder(1, 1, 0, 1, new Color(153,204,204));
}
} else {
if (col < 30) {
border = new MatteBorder(1, 1, 1, 0, new Color(153,204,204));
} else {
border = new MatteBorder(1, 1, 1, 1, new Color(153,204,204));
}
}
cell.setBorder(border);
cellList.add(counter, cell);
counter++;
this.add(cell,gbc);
}
System.out.println("Count: " + this.getComponentCount());
for(Cell c: cellList){
System.out.println(c.getCellCol()+" "+c.getCellRow());
}
}
public List getCellList(){
return cellList;
}
public int getCellCount(){
return counter;
}}
这里是单元格类
class Cell extends JPanel implements MouseListener, PropertyChangeListener{
private final Color defaultBackground = new Color(240,240,240);
private final Color clickedColor = new Color(204,0,102);
private final Color movingColor = new Color(153,255,153);
private final int row ,col;
//private CellPane cp = new CellPane();
public Cell(int x, int y) {
this.col = x;
this.row = y;
if (col>0 & row>0){
addMouseListener(this);
}
if(col==0 | row == 0){
addPropertyChangeListener(this);
}
if (col == 0){
this.setPreferredSize(new Dimension(100,35));
}
else{
this.setPreferredSize(new Dimension(35,35));
}
}
@Override
public void mouseClicked(MouseEvent me) {
}
@Override
public void mousePressed(MouseEvent me) {
if(col>0 & row>0 & this.getBackground().equals(movingColor)){
this.setBackground(clickedColor);
}
else if(this.getBackground().equals(clickedColor)){
this.setBackground(defaultBackground);
}
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
if(col>0 & row>0 & this.getBackground().equals(defaultBackground)){
this.setBackground(movingColor);
System.out.println("You clicked on: " + col +" " +row);
System.out.println("List Size: " );
}
}
@Override
public void mouseExited(MouseEvent me) {
if(col>0 & row>0 & this.getBackground().equals(movingColor)){
this.setBackground(defaultBackground);
}
}
@Override
public void propertyChange(PropertyChangeEvent pce) {
}
public int getCellCol(){
return this.col;
}
public int getCellRow(){
return this.row;
}}
这里是主类
public class ScheduleForm {
private JFrame mainFrame;
private JPanel pnlButtons;
private JPanel pnlCalendar;
private CellPane cellPane;
public ScheduleForm(){
initButtonPanel();
initCalendarPane();
initFrame();
}
private void initCalendarPane(){
pnlCalendar = new JPanel(new BorderLayout());
pnlCalendar.setPreferredSize(new Dimension(100,500));
pnlCalendar.setBorder(BorderFactory.createLineBorder(Color.ORANGE));
cellPane = new CellPane();
pnlCalendar.add(cellPane,BorderLayout.CENTER);
}
private void initButtonPanel(){
pnlButtons = new JPanel(new BorderLayout());
pnlButtons.setPreferredSize(new Dimension(100,100));
pnlButtons.setBorder(BorderFactory.createTitledBorder("Buttons"));
}
private void initFrame(){
mainFrame = new JFrame("Schedule");
mainFrame.setLayout(new BorderLayout());
mainFrame.add(pnlButtons, BorderLayout.NORTH);
mainFrame.add(pnlCalendar,BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setLocationRelativeTo(mainFrame);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
mainFrame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
}
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(PopTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
////EDW tha mpei to neo antikeimeno
ScheduleForm scheduleForm = new ScheduleForm();
}
});
}}
【问题讨论】:
-
您可以创建一个二维数组并将所有单元格存储在其中。 (然后拨打
array[row][col].setBackground(...)) -
你能说得更具体一点,因为我已经将单元格存储在一个列表中。但我不知道如何从容器类中获取列表并在 enterMouseListener 中使用它。或者我的逻辑是完全偏离主题?
-
如果我的回答有道理,或者您对此有任何疑问,请告诉我。
标签: java swing mouselistener gridbaglayout