[Java] JButton in BorderLayout genereert geen event

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17:58

Matis

Rubber Rocket

Topicstarter
Beste PRGers,

ik ben momenteel bezig met de ontwikkeling van een GUI-applicatie in Java. Ik zit nu in de fase dat ik de stramien van de GUI aan het opzetten ben, zonder de elementen te voorzien van bruikbare gegevens.
De nesting van mijn GUIziet er zo uit:
Ik heb de indeling even in een XML-formaat gegoten, dat leest misschien makkelijker.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<JFrame class="AapMainWindow">
  <JMenuBar class="AapMainMenu">
    /* Meerdere JMenu-items met werkende addActionListener(this) */
  </JMenuBar>
  <JTabbedPane>
    <JPanel class="AapBookingWindow">
      <BorderLayout>
        <North>
          /* AapBookingTable.getTableHeader() */
        </North>
        <Center>
          <JScrollPane>
            <JTable class="AapBookingTable">
              /* Bogus Data */
            </JTable>
          </JScrollPane>
        </Center>
        <South>
          <JPanel class="AapBookingMenu">
            <JButton>
              /* Geen addActionListener(this) event gegenereerd */
            </JButton>
            <JButton>
              /* Geen addActionListener(this) event gegenereerd  */
            </JButton>
            <JButton>
              /* Geen addActionListener(this) event gegenereerd  */
            </JButton>
          </JPanel>
        </South>
      </BorderLayout>
    </JPanel>
    <JPanel class="AapSettingWindow">
      <JPanel class="AapBookingMenu">
        <JButton>
          /* Wel addActionListener(this) event gegenereerd  */
        </JButton>
        <JButton>
          /* Wel addActionListener(this) event gegenereerd  */
        </JButton>
        <JButton>
          /* Wel addActionListener(this) event gegenereerd  */
        </JButton>
      </JPanel>
    </JPanel>
  </JTabbedPane>
</JFrame>


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class AapBookingMenu extends JPanel implements ActionListener
{
  private static final long serialVersionUID = -9014825286121191673L;
  private JButton           _removeButton    = null;
  private JButton           _addButton       = null;
  private JButton           _editButton      = null;

  public AapBookingMenu()
  {
    super();
    _removeButton = new JButton("Remove");
    _addButton = new JButton("Add");
    _editButton = new JButton("Edit");
    _removeButton.setEnabled(true);
    _removeButton.addActionListener(this);
    _addButton.addActionListener(this);
    _editButton.addActionListener(this);
    this.add(_addButton);
    this.add(_editButton);
    this.add(_removeButton);
  }

  @Override
  public void actionPerformed(ActionEvent actionEvent)
  {
    System.err.printf("Error at: %s \n", new Exception().getStackTrace()[0]);
    final Object source = actionEvent.getSource();
    if (source.equals(_addButton))
    {

    } else if (source.equals(_editButton))
    {

    } else if (source.equals(_removeButton))
    {

    } else
    {
      System.err.printf("Error at: %s \n", new Exception().getStackTrace()[0]);
    }
  }
}

In het eerste tabje wordt de actionPerformed() nooit aangeroepen. Ook veranderd er niets aan de style van de JButtons wanneer er met de muis overheen gehoverd wordt, of op de JButton geklikt wordt.

In het tweede tabje werkt de event-handler prima. Ook worden de JButtons dan anders gekleurd wanneer er overheen gehoverd wordt. Wanneer je op één van de drie buttons drukt, zal ook netjes de Error-regel op het scherm geprint worden.

Wat is hier voor geks aan de hand 8)7

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Waarschijnlijk als de code wordt doorgelopen, wordt eerst de eventhandler aan de eerste tab toegewezen, daarna aan de tweede tab. Dit kan je testen door de tweede tab te verwijderen en te kijken of dan opeens de actions voor de eerste tab wel werken.

Edit: aan de andere kant geef je aan dat je bij de eerste tab geen EventHandlers toevoegt voor de buttons in je XML layout? Dat zou natuurlijk de meest logische verklaring zijn.

[ Voor 33% gewijzigd door MacWolf op 26-03-2011 17:02 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17:58

Matis

Rubber Rocket

Topicstarter
MacWolf schreef op zaterdag 26 maart 2011 @ 16:58:
Waarschijnlijk als de code wordt doorgelopen, wordt eerst de eventhandler aan de eerste tab toegewezen, daarna aan de tweede tab. Dit kan je testen door de tweede tab te verwijderen en te kijken of dan opeens de actions voor de eerste tab wel werken.
Nope, maakt niets uit. Wanneer ik het menu en het tweede (tevens laatste) tabje weghaal, verandert er niets aan het gedrag van de JButtons in de BorderLayout.
Wanneer ik de tabvolgorde omdraai, blijven de JButtons in SettingWindow werken en in BookingWindow werkt het nog steeds niet.
Het maakt ook niet uit of ik de constructors omdraai.
Edit: aan de andere kant geef je aan dat je bij de eerste tab geen EventHandlers toevoegt voor de buttons in je XML layout? Dat zou natuurlijk de meest logische verklaring zijn.
Ik heb het misschien wat rottig opgeschreven, ik bedoelde dat er geen event gegenereerd wordt. Ik heb de tekst nu aangepast :)

[ Voor 50% gewijzigd door Matis op 26-03-2011 17:06 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Werkt het wellicht als je het volgende doet i.p.v. verwijzen naar 'this'?

Java:
1
2
3
4
5
6
_addButton.addActionListener(
   new ActionListener() {   
      public void actionPerformed(ActionEvent event) {
          // doe één of andere actie, print bijvoorbeeld naar Console.
      }
}); 

[ Voor 194% gewijzigd door MacWolf op 26-03-2011 17:35 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17:58

Matis

Rubber Rocket

Topicstarter
MacWolf schreef op zaterdag 26 maart 2011 @ 17:13:
Werkt het wellicht als je het volgende doet i.p.v. verwijzen naar 'this'?

Java:
1
2
3
4
5
6
_addButton.addActionListener(
   new ActionListener() {   
      public void actionPerformed(ActionEvent event) {
          // doe één of andere actie, print bijvoorbeeld naar Console.
      }
}); 
Bedankt voor je meedenken, maar ook dat maakt geen verschil. Ik had dat overigens al geprobeerd :)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17:58

Matis

Rubber Rocket

Topicstarter
Excuses op voorhand voor de topic-kick binnen 24 uur, maar ik heb de oorzaak gevonden :)
Het probleem is het volgende
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AapBookingWindow extends JPanel
{
  private static final long serialVersionUID = -8804024644944888344L;
  private AapBookingTable   _table           = null;
  private AapBookingMenu    _menu            = null;

  public AapBookingWindow()
  {
    super();
    _table = new AapBookingTable();
    _menu = new AapBookingMenu();
    JScrollPane scrollPane = new JScrollPane(_table);
    scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    this.setLayout(new BorderLayout());
    JTableHeader tableHeader = _table.getTableHeader();
    this.add(tableHeader, BorderLayout.NORTH);
    this.add(scrollPane, BorderLayout.CENTER);
    this.add(_menu, BorderLayout.SOUTH);
  }
}

Regeltje 17 geeft de problemen, waarom weet ik niet. De hele TableHeader lijkt ook overbodig te zijn, want ook by default (dus wanneer ik regeltje 16 en 17 weghaal) krijg ik gewoon netjes een tableheader te zien.

Het probleem lijkt opgelost, maar waarom het in eerste instantie optrad is me een raadsel :/

If money talks then I'm a mime
If time is money then I'm out of time

Pagina: 1