Seite 2 von 4

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 18:56
von Sheldon2012
Für die Zeilenanzahl sollte doch eigentlich ein simple "y++" reichen, oder?
Das klappt nämlich nicht.

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 20:05
von ds10
Nein, das reicht nicht, das legt nur fest, in welcher Zeile die Komponente ist. Die Zeilen muss man vorher im FormLayout definieren.

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 21:59
von Sheldon2012
Sorry, aber ich sehe es irgendwie nicht. Was ich im Code habe ist nur das.

Code: Alles auswählen


  FormLayout layout = new FormLayout("default,3dlu,100dlu:grow,3dlu,default","default,3dlu,fill:default:grow");
    
    setLayout(layout);
    
    setOpaque(false);
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER) {
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu"));
    }

Bitte verrate mir, wo ich die Zeilenanzahl hinterlege.

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 22:05
von ds10
Eigentlich ist das ja sogar sprechender Quellcode:

Code: Alles auswählen

      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu"));
Liest sich als: Layout.ZeileEinfügen(Zeilennummer, Zeilenformat);

Das kannst du ein weiteres Mal ohne Bedingung einfügen, damit du eine neue Zeile mit Standardhöhe (default) und eine Abstandszeile mit der Höhe 3dlu erhältst.

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 22:55
von Sheldon2012
So hatte ich mir das auch gedacht! Aber wenn ich das ausprobiere, funktioniert es nicht.
Was mache ich denn da falsch?

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 23:45
von ds10
Bekommst du denn keine Fehlermeldung? Normalerweise müsste eine Exception auftreten, wenn man eine Komponente einer nicht existierenden Zeile hinzuzufügen versucht.

Re: Sendungsliste - Navigation

Verfasst: 28 Jun 2015, 23:49
von Sheldon2012
Nein, die GUI wird nur nicht korrekt aufgebaut.

Re: Sendungsliste - Navigation

Verfasst: 29 Jun 2015, 08:45
von ds10
Dann fügst du die Komponenten vielleicht einfach nicht in die richtigen Zeilen ein, so dass sie z.B. in einer 3dlu-Zeile landen. 3dlu ist aber nur der Zwischenraum und damit sehr schmal, so dass man in der Regel nicht viel von den Komponenten sieht.

Du kannst auch testweise ein try{}catch(Throwable t) {t.printStackTrace();} um die Erstellung der GUI in createGui() legen um sicher zu gehen, auch wirklich keinen Fehler zu verpassen.

Re: Sendungsliste - Navigation

Verfasst: 29 Jun 2015, 16:25
von Sheldon2012
Gehen wir das Ganze doch mal systematisch Schritt für Schritt an.

Also nach ein wenig "Try and Error" wird die GUI richtig angezeigt. Aber irgendwie ist das immer noch seltsam.
Das kann doch nicht so gedacht sein, oder? Irgendwo habe ich da noch einen Denkfehler.
Vielleicht schaust Du Dir das mal an.

Code: Alles auswählen


 private void createGUI(int type, boolean showNumberOfPrograms, int startType, ProgramFilter startFilter) {
    FormLayout layout = new FormLayout("default,3dlu,100dlu:grow,3dlu,default","default,3dlu,fill:default:grow");
    
    setLayout(layout);
    
    setOpaque(false);
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER) {
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu"));  
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu")); 
      layout.insertRow(1, RowSpec.decode("default"));
      layout.insertRow(2, RowSpec.decode("3dlu")); 
    }
    
    int y = 1;   
        
    Channel[] subscribedChannels = Plugin.getPluginManager().getSubscribedChannels();
    mChannelBox = new WideComboBox();
    
    mChannelBox.addItem("Alle");
    for (int i = 0; i < subscribedChannels .length; i++) {
       mChannelBox.addItem (subscribedChannels[i]);
    }
    if (mSelectedChannel != null) {
      mChannelBox.setSelectedItem(mSelectedChannel);
    }    
     
    mChannelBoxLabel = new JLabel("Sender");   
    
    add(mChannelBoxLabel , CC.xy(1, y));
    add(mChannelBox , CC.xyw(3, y, 3));  
    
    y+=2;

    mProgramFilterBox = new WideComboBox();
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER || type == TYPE_PROGRAM_ONLY_FILTER) {
      mProgramFilterBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
          if(e.getStateChange() == ItemEvent.SELECTED) {
            filterPrograms((ProgramFilter)mProgramFilterBox.getSelectedItem());
            scrollToFirstNotExpiredIndex(false);
          }
        }
      });
      
      fillProgramFilterBox(startType, startFilter);
      
      JButton refresh = new JButton(TVBrowserIcons.refresh(TVBrowserIcons.SIZE_SMALL));
      refresh.setToolTipText(LOCALIZER.msg("refresh", "Refresh list with current filter"));
      refresh.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          filterPrograms((ProgramFilter)mProgramFilterBox.getSelectedItem());
        }
      });      
      
      long refreshDureation = 10*60*1000; // refresh duration in milliseconds set to 10 minutes
      Timer timer = new Timer();

      timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
          filterPrograms((ProgramFilter)mProgramFilterBox.getSelectedItem());
        }
      }, refreshDureation, refreshDureation);      
      
      mProgramFilterLabel = new JLabel(LOCALIZER.msg("filterPrograms", "Program filter:"));
      
      add(mProgramFilterLabel, CC.xy(1, y));
      add(mProgramFilterBox, CC.xy(3, y));
      
      add(refresh, CC.xy(5, y));
      
      y+=2;
    }
    else {
      mProgramFilterBox.addItem(FilterManagerImpl.getInstance().getAllFilter());
    }      
    
    if(type == TYPE_NAME_AND_PROGRAM_FILTER || type == TYPE_NAME_ONLY_FILTER) {
      mTitleFilterBox = new WideComboBox();
      mTitleFilterBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
          if(e.getStateChange() == ItemEvent.SELECTED) {
            filterPrograms((ProgramFilter)mTitleFilterBox.getSelectedItem(), true);
            scrollToFirstNotExpiredIndex(false);
          }
        }
      });
      
      mTitleFilterLabel = new JLabel(LOCALIZER.msg("filterTitles","Title filter:"));

      add(mTitleFilterLabel, CC.xy(1, y));
      add(mTitleFilterBox, CC.xyw(3, y, 3));
      
      y+=2;       
    }  
        
    
    if(showNumberOfPrograms) {
      layout.insertRow(y, RowSpec.decode("default"));
      layout.insertRow(y+1, RowSpec.decode("3dlu"));
      
      mNumberLabel = new JLabel(LOCALIZER.msg("numberOfPrograms", "Number of shown programs: {0}", 0));
      
      add(mNumberLabel, CC.xyw(1, y, 5));
    }
       
    mProgramListScrollPane = new JScrollPane(mProgramList);
    mProgramListScrollPane.setBorder(null);   
     
    y+=4;        
    
    add(mProgramListScrollPane, CC.xyw(1, y, 5));
  }  

Nun habe ich eine public-Methode gebaut, die einen Channel annimmt und in ein Feld der Klasse schreibt.

Code: Alles auswählen


  public void setSelectedChannel(Channel selectedChannel) {
	  mSelectedChannel = selectedChannel;
  }

Diesen selektierten Channel übernimmt ja dann die Combobox.
Aber wo muß ich die nun aufrufen. Das habe ich noch nicht gefunden.

Die Implementierungen für den Label-Text "Sender" und den Eintrag "Alle " sind auch noch stark verbesserungswürdig.
Vielleicht hast Du dafür auch eine Idee. Irgenwo muß das Ding doch ein Property-File haben.

Re: Sendungsliste - Navigation

Verfasst: 29 Jun 2015, 20:43
von ds10
Du musst den Sender nicht als Klassenvariable abspeichern, denn du hast ja schon die Combobox als Klassenvariable, bei der kannst du einfach getSelectedItem() abfragen und natürlich auch in der Methode setSelectedChannel den ausgewählten Sender der Combox mit setSelectedItem(Channel) setzten. Da auf der Combobox ein ItemListener registriert ist, wird bei jeder Änderung des ausgewählten Senders der ItemListener ausgelöst, der dann die Methode zum Neuaufbau der Liste auslöst.

In der Methode, die die Liste füllt, musst du dann natürlich den ausgewählten Sender der Combobox abfragen und mit den Sendern der Sendungen vergleichen um die dann entsprechend zu filtern. Um den Aufruf von extern um über die Senderliste den auszuwählen brauchst du dich noch gar nicht kümmern solange du nicht mit der Combobox selbst die Filterung erfolgreich durchführen kannst.

Re: Sendungsliste - Navigation

Verfasst: 30 Jun 2015, 16:15
von Sheldon2012
Das Filtern mit dem entsprechennde Sender habe ich hinbekommen. Nun fehlt eigentlich nur noch der externe Aufruf.
Wo muß ich meine public-Methode setSelectedChannel(Channel selectedChannel) denn aufrufen?

Re: Sendungsliste - Navigation

Verfasst: 30 Jun 2015, 18:27
von ds10
In FavoritesPlugin.java gibt es in Zeile 193 ein PluginCenterPanelWrapper, dort musst du die Methode public void scrolledToChannel(Channel channel) { überschreiben, die wird von TV-Browser aufgerufen, wenn ein Sender in der Liste angeklickt wird. Das läuft dann genau wie bei filterSelected in der gleichen Klasse.

Re: Sendungsliste - Navigation

Verfasst: 30 Jun 2015, 19:20
von Sheldon2012
Also ich hab edas mal mit diesem Ansatz vrsucht, aber der Konstruktor muß wohl anders gefüllt werden, oder?
Das klappt nämlich nicht.

Code: Alles auswählen


      @Override
      public void scrolledToChannel(Channel channel) {
    	  FilterableProgramListPanel filterableProgramListPanel = new FilterableProgramListPanel(0, null, false, false, null, 0);
       	  filterableProgramListPanel.setSelectedChannel(channel);     	  
      }


Re: Sendungsliste - Navigation

Verfasst: 30 Jun 2015, 19:48
von ds10
Das Panel gibt es schon, das musst du da nicht neu anlegen. Ich schrieb ja, dass du es analog zur Methode filterSelected(ProgramFilter) in PluginCenterPanelWrapper umsetzen kannst.

Re: Sendungsliste - Navigation

Verfasst: 30 Jun 2015, 20:05
von Sheldon2012
Dann verstehe ich Dich gerade nicht.

filterSelected(ProgramFilter filter) wird so überschrieben

Code: Alles auswählen


      @Override
      public void filterSelected(ProgramFilter filter) {
        if(mMangePanel != null && reactOnFilterChange()) {
          mMangePanel.selectFilter(filter);
        }
      }
Ich brauche aber doch ein FilterableProgramListPanel und eclipse sagt mir, dass er das nicht hat.
Wo ist mein Denkfehler?