Hallo Leute, komme momentan bei meinem Rss-Reader-Applet nicht weiter, und hoffe ihr könnt mir ein paar Tipps geben. Prinzipiell funktioniert das Applet so wie es soll, es lädt über eine Parser-Klasse den Rss-Feed ein und zeigt die Daten dann im Applet an.
In meiner Entwicklungsumgebung Eclipse Indigo und im Browser auf meinem Entwicklungsrechner funktioniert das Applet wie gewünscht, auch das Einladen von ca. 30 kleinen Bildern dauert nicht länger als 10 Sekunden.
Auf einem anderen Rechner (selbe Java- und Browser-Version dauert das Laden der 30 Bilder aber ca. 7 Minuten!! ) Desweiteren ist während des Ladens die GUI nicht mehr bedienbar, obwohl ich das Laden der Bilder über die News-Parser Klasse mittlerweile über einen SwingWorker-Thread mache, und das eigentlich im Hintergrund geschehen sollte???
Wäre nett falls jemand einen Vorschlag für mich hätte?!?
In meiner Entwicklungsumgebung Eclipse Indigo und im Browser auf meinem Entwicklungsrechner funktioniert das Applet wie gewünscht, auch das Einladen von ca. 30 kleinen Bildern dauert nicht länger als 10 Sekunden.
Auf einem anderen Rechner (selbe Java- und Browser-Version dauert das Laden der 30 Bilder aber ca. 7 Minuten!! ) Desweiteren ist während des Ladens die GUI nicht mehr bedienbar, obwohl ich das Laden der Bilder über die News-Parser Klasse mittlerweile über einen SwingWorker-Thread mache, und das eigentlich im Hintergrund geschehen sollte???
Wäre nett falls jemand einen Vorschlag für mich hätte?!?
Java:
public class Start extends JApplet {
private static final long serialVersionUID = 1L;
private JPanel panel;
private FeedArray feed_array = new FeedArray();
private FeedData actual_feed = new FeedData();
private FeedUrls actual_feedurls = new FeedUrls();
private Image actual_image = null;
private JTextPane ui_newstitle;
private JTextField ui_category_text;
private JTextField ui_feedtime_text;
private JLabel ui_newsimage;
private JTextPane ui_newstext;
private JLabel ui_control_display;
private JScrollPane ui_newstext_scrollPane;
private JLabel ui_button_nextfeed;
private JLabel ui_button_prevfeed;
private boolean task_is_free=true;
private GregorianCalendar feed_zeit,akt_zeit;
private String actual_feedtime_string = "";
ImageIcon loader_gif = new ImageIcon(this.getClass().getClassLoader().getResource("ajaxloader.gif"));
ImageIcon pic,pic2;
JFrame frame5 = new JFrame();
JFrame frame2 = new JFrame();
public Start() {
}
public class ControlListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent arg0) {
if(arg0.getComponent().equals(ui_button_nextfeed)
&&(Integer.parseInt(actual_feed.getFeedNumber())<feed_array.getFeedCount())){
int i = Integer.parseInt(actual_feed.getFeedNumber().trim());
actual_feed=feed_array.getFeed().get(i+1);
log("After: "+actual_feed.getFeedNumber());
log("--> Nächsten Beitrag aufrufen "+(i+1));
updateUI();
}
else {
int i = Integer.parseInt(actual_feed.getFeedNumber().trim());
actual_feed=feed_array.getFeed().get(i-1);
log("--> Vorherigen Beitrag aufrufen "+(i-1));
updateUI();
}
if(arg0.getClickCount()>1){
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
public void initUI(){
getContentPane().setLayout(null);
panel = new JPanel();
panel.setBackground(Color.BLACK);
panel.setBounds(0, 0, 335, 210);
getContentPane().add(panel);
panel.setLayout(null);
ui_category_text = new JTextField();
ui_category_text.setFont(new Font("Tekton Pro", Font.BOLD, 11));
ui_category_text.setEditable(false);
ui_category_text.setHorizontalAlignment(SwingConstants.CENTER);
ui_category_text.setBackground(Color.BLACK);
ui_category_text.setForeground(Color.WHITE);
ui_category_text.setText("#Kategorie");
ui_category_text.setBounds(0, 39, 170, 20);
ui_category_text.setBorder(BorderFactory.createLineBorder(new Color(184,90,12),1,false));
panel.add(ui_category_text);
ui_category_text.setColumns(10);
ui_feedtime_text = new JTextField();
ui_feedtime_text.setFont(new Font("Tekton Pro", Font.BOLD, 11));
ui_feedtime_text.setEditable(false);
ui_feedtime_text.setBackground(Color.BLACK);
ui_feedtime_text.setForeground(Color.WHITE);
ui_feedtime_text.setBorder(BorderFactory.createLineBorder(new Color(184,90,12),1,false));
ui_feedtime_text.setHorizontalAlignment(SwingConstants.CENTER);
ui_feedtime_text.setText("#Ver\u00F6ffentlichungszeit");
ui_feedtime_text.setBounds(169, 39, 165, 20);
panel.add(ui_feedtime_text);
ui_feedtime_text.setColumns(10);
ui_feedtime_text.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getClickCount()>1){
if(Properties.FEEDTIME_MODUS.equals("1")){
Properties.FEEDTIME_MODUS="0";
updateUI();
}
else {Properties.FEEDTIME_MODUS="1";
updateUI();
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}});
ui_newsimage = new JLabel("");
ui_newsimage.setHorizontalAlignment(SwingConstants.CENTER);
ui_newsimage.setToolTipText("Klicken Sie auf das Bild, um es in voller Gr\u00F6\u00DFe anzuzeigen...");
ui_newsimage.setBounds(10, 69, 110, 108);
//ImageIcon ico = new ImageIcon(this.getClass().getClassLoader().getResource("ajaxloader.gif"));
//Image actual_image = ico.getImage();
//ico.setImage(actual_image.getScaledInstance(ui_newsimage.getWidth(),ui_newsimage.getHeight(), Image.SCALE_DEFAULT));
ui_newsimage.setIcon(loader_gif);
//ui_newsimage.setText("News-Image");
ui_newsimage.addMouseListener(new MouseListener(){
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
frame2.setVisible(false);
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
Point applet_location = Start.this.getLocationOnScreen();
Dimension applet_size = Start.this.getSize();
try {
showNewsImageFrame(e,applet_location,applet_size);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
panel.add(ui_newsimage);
ui_newstitle = new JTextPane();
ui_newstitle.setToolTipText("Doppelklicken Sie hier, um den vollst\u00E4ndigen Artikel in ihrem Standard-Webbrowser anzuzeigen");
ui_newstitle.setEditable(false);
ui_newstitle.setFont(new Font("Lucida Sans", Font.BOLD, 13));
ui_newstitle.setText("#News-Titel");
ui_newstitle.setForeground(Color.WHITE);
ui_newstitle.setBackground(Color.BLACK);
ui_newstitle.setBounds(0, 0, 290, 38);
ui_newstitle.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0) {
if(arg0.getClickCount()>1){
showInDefaultWebBrowser(actual_feed.getLink_web());
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}});
panel.add(ui_newstitle);
ui_newstext_scrollPane = new JScrollPane();
ui_newstext_scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
ui_newstext_scrollPane.setBounds(130, 65, 195, 130);
ui_newstext_scrollPane.setViewportBorder(null);
ui_newstext = new JTextPane();
ui_newstext.setBounds(0, 0, 80, 300);
ui_newstext.setEditable(false);
ui_newstext.setPreferredSize(ui_newstext_scrollPane.getPreferredSize());
//ui_newstext.setForeground(new Color(184,90,12));
ui_newstext.setText("#News-Zusammenfassung");
ui_newstext.setForeground(Color.WHITE);
ui_newstext.setBackground(Color.BLACK);
ui_newstext.setBorder(null);
final Border emptyBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0);
ui_newstext_scrollPane.setBorder(emptyBorder);
ui_newstext_scrollPane.setOpaque(true);
ui_newstext_scrollPane.setViewportView(ui_newstext);
panel.add(ui_newstext_scrollPane);
ui_button_nextfeed = new JLabel("New label");
ui_button_nextfeed.setToolTipText("Zur n\u00E4chsten Nachricht springen...");
ui_button_nextfeed.setBounds(98, 180, 24, 24);
ui_button_nextfeed.setBackground(Color.BLACK);
ui_button_nextfeed.addMouseListener(new ControlListener());
ImageIcon pic = new ImageIcon(this.getClass().getClassLoader().getResource("control/right.png"));
Image img = pic.getImage();
//pic.setImage(img.getScaledInstance(lblNewLabel.getWidth(),lblNewLabel.getHeight(), Image.SCALE_DEFAULT));
ui_button_nextfeed.setIcon(pic);
panel.add(ui_button_nextfeed);
ui_button_prevfeed = new JLabel("New label");
ui_button_prevfeed.setToolTipText("Zur vorherigen Nachricht springen...");
ui_button_prevfeed.setBackground(Color.BLACK);
ui_button_prevfeed.setBounds(8, 180, 24, 24);
ui_button_prevfeed.addMouseListener(new ControlListener());
pic = new ImageIcon(this.getClass().getClassLoader().getResource("control/left.png"));
img = pic.getImage();
ui_button_prevfeed.setIcon(pic);
panel.add(ui_button_prevfeed);
ui_control_display = new JLabel("## von ##");
ui_control_display.setHorizontalAlignment(SwingConstants.CENTER);
ui_control_display.setFont(new Font("Tahoma", Font.BOLD, 11));
ui_control_display.setBackground(Color.BLACK);
ui_control_display.setForeground(Color.WHITE);
ui_control_display.setBounds(32, 184, 64, 14);
panel.add(ui_control_display);
panel.repaint();
// new ImageIcon(this.getClass().getClassLoader().getResource("64x64/little/32.png"))
}
public void parseParam(String url){
String parameters;
if (url.indexOf("?") > -1) {
parameters = url.substring(url.indexOf("?") + 1);
ArrayList<String> valueliste = new ArrayList<String>();
ArrayList<String> paramliste = new ArrayList<String>();
StringTokenizer paramGroup = new StringTokenizer(parameters, "&");
log("@ParseParam ParamString: "+parameters);
while(paramGroup.hasMoreTokens()){
StringTokenizer value = new StringTokenizer(paramGroup.nextToken(), "=");
paramliste.add(value.nextToken());
valueliste.add(value.nextToken());
}
for(int i=0;i<valueliste.size();i++){
log("@ParseParam ParamArray "+i+":"+paramliste.get(i).toString());
log("@ParseParam ValueArray "+i+":"+valueliste.get(i).toString());
if(paramliste.get(i).equalsIgnoreCase("update")){Properties.UPDATE_INTERVAL=Long.parseLong(valueliste.get(i).toString())*1000;}
if(paramliste.get(i).equalsIgnoreCase("category")){Properties.CATEGORY=valueliste.get(i).toString();}
if(paramliste.get(i).equalsIgnoreCase("autoswitch")){}
if(paramliste.get(i).equalsIgnoreCase("log")){if(valueliste.get(i).equals("yes"))Properties.LOGGING_ENABLED=true;
else Properties.LOGGING_ENABLED=false; }
if(paramliste.get(i).equalsIgnoreCase("yes")){}
}
}
}
private void showNewsImageFrame(MouseEvent e,Point p,Dimension d) throws MalformedURLException{
double wx,wy;
int x,y;
wx=d.getWidth();
wy=d.getHeight();
Dimension screen_size = getToolkit().getScreenSize();
x=p.x; y=p.y;
if(e.getClickCount()==1){
frame2.getContentPane().removeAll();
if(!(frame2.isUndecorated())) frame2.setUndecorated(true);
frame2.getContentPane().setLayout(null);
//frame.setBounds(0,0,400,400);
JLabel label = new JLabel();
label.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
//label.setBounds(0,0,200,200);
label.setText("Hallo");
//ImageIcon pic_orig = new ImageIcon(new URL(actual_feed.getLink_pic()));
ImageIcon pic_orig = actual_feed.getImage();
Image img = pic_orig.getImage();
if(wy+img.getWidth(pic_orig.getImageObserver())+y<=screen_size.height){
frame2.setBounds(x,(int) (y+wy),img.getWidth(pic_orig.getImageObserver()),img.getHeight(pic_orig.getImageObserver()));
}
else {
frame2.setBounds(x,(int) (y-img.getHeight(pic_orig.getImageObserver())),img.getWidth(pic_orig.getImageObserver()),img.getHeight(pic_orig.getImageObserver()));
}
label.setBounds(0,0,frame2.getWidth(),frame2.getHeight());
pic_orig.setImage(img);
label.setIcon(pic_orig);
//ImageIcon icon = new ImageIcon(NewsParser.imageimage);
frame2.getContentPane().add(label);
frame2.setVisible(true);
}
}
private void showInDefaultWebBrowser(String url) {
Desktop desk = Desktop.getDesktop();
try {
desk.browse(new URI(url));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class ImageWorkerTask extends SwingWorker<FeedArray,Void> {
private NewsParser np = new NewsParser();
private FeedArray fa = new FeedArray();
private FeedUrls urls = new FeedUrls();
ImageWorkerTask() {
}
@Override
public FeedArray doInBackground() {
System.out.println("NewsParser wird ausgeführt...");
urls.setAdhoc();
try {
fa = np.parse(urls);
} catch (Exception e) {
task_is_free=true;
e.printStackTrace();
}
System.out.println("Newsparser fertig...");
return fa;
}
@Override
public void done(){
try {
Start.this.feed_array=this.get();
actual_feed = feed_array.getFeed().get(0);
updateUI();
task_is_free=true;
} catch (InterruptedException e) {
task_is_free=true;
e.printStackTrace();
} catch (ExecutionException e) {
task_is_free=true;
e.printStackTrace();
}
}
}
public void init(){
initUI();
String url = getDocumentBase().toString();
String parameters="";
log("Url: "+url);
ArrayList<String> params=new ArrayList<String>();
log("ParamString: "+parameters);
this.parseParam(url);
for (int i = 0; i < params.size(); i++) {
log("Param "+i+": "+params.get(i));
}
actual_feedurls = new FeedUrls();
actual_feedurls.setWissenschaft();
Timer t = new Timer();
t.scheduleAtFixedRate(new updateFeedsTask(), 1,Properties.UPDATE_INTERVAL);
// parseFeeds(actual_feedurls);
}
public void parseFeeds(FeedUrls urls){
ui_newsimage.setIcon(loader_gif);
NewsParser parser = new NewsParser();
try{
feed_array = parser.parse(urls);
actual_feed = feed_array.getFeed().get(0);
updateUI();}
catch (Exception e){
log("Problem mit der Internetverbindung");
}
}
public void updateUI(){
frame2.setVisible(false);
ui_category_text.setText(actual_feed.getCategory());
ui_newstext.setText(actual_feed.getSummary());
DefaultCaret caret = (DefaultCaret) ui_newstext.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
ui_newstitle.setText(actual_feed.getTitle());
calculateFeedTime(actual_feed.getUpdated());
if(Properties.FEEDTIME_MODUS=="1") { ui_feedtime_text.setText(actual_feedtime_string); }
else { SimpleDateFormat df = new SimpleDateFormat("EEE, dd-MMM-yy HH:mm:ss");
ui_feedtime_text.setText(df.format(feed_zeit.getTime()));}
/*Runnable runnable = new ImageThread();
Thread thread = new Thread(runnable);
thread.start();*/
//setNewsImage(actual_feed.getLink_pic());
//ImageWorkerTask task = new ImageWorkerTask(actual_feed.getLink_pic(),ui_newsimage.getWidth(),ui_newsimage.getHeight());
//task.execute();
ImageIcon ico = new ImageIcon();
//ico = actual_feed.getImage(); ACHTUNG CALL BY REFERENCE auf Actual-Feed!!!!!!!!
ico.setImage(actual_feed.getImage().getImage());
Image actual_image = ico.getImage();
ico.setImage(actual_image.getScaledInstance(ui_newsimage.getWidth(),ui_newsimage.getHeight(), Image.SCALE_DEFAULT));
ui_newsimage.setIcon(ico);
ui_control_display.setText((Integer.parseInt(actual_feed.getFeedNumber())+1)
+" von "
+ (feed_array.getFeedCount()));
JScrollBar sb = ui_newstext_scrollPane.getVerticalScrollBar();
log("Value vorher: "+sb.getMinimum());
sb.setValue(0);
ui_newstext_scrollPane.setVerticalScrollBar(sb);
log("Value neu: "+ui_newstext_scrollPane.getVerticalScrollBar().getValue());
ui_newstext_scrollPane.getViewport().setViewPosition(new Point(0,0));
}
class updateFeedsTask extends TimerTask {
public void run ( ) {
System.out.println("FLAG TaskIsFree: "+task_is_free);
// parseFeeds(actual_feedurls);
ImageWorkerTask task = new ImageWorkerTask();
if(task_is_free){
log ( "@updateFeedTask Reguläres Update der Feeddaten..." ) ;
task_is_free=false;
task.execute();
}
//timer.cancel ( ) ; //Terminate the thread
}
}
private void calculateFeedTime(String timestring) {
log(timestring.trim());
String datum=""; String zeit=""; String diff="";
String[] s = timestring.split("T");
if(s.length>1){datum=s[0].trim();}
log(datum);
s = timestring.split("\\+");
if(s.length>1){diff=s[1];s=s[0].split("T");}
if(s.length>1){zeit=s[1];}
log(zeit);
String year,month,day,hour,min,sec,diff1="";
s=datum.split("-");
year=s[0];month=s[1];day=s[2];
s=zeit.split(":");
hour=s[0];min=s[1];sec=s[2];
s=diff.split(":");
diff1=s[0];
Integer help = Integer.parseInt(hour); help+=Integer.parseInt(diff1);
hour = help.toString();
log(year+" "+month+" "+day);
log(hour+" "+min+" "+sec);
log(diff);
feed_zeit = new GregorianCalendar();
akt_zeit = new GregorianCalendar();
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
SimpleDateFormat tf = new SimpleDateFormat("HH-mm-ss");
feed_zeit.set(Integer.parseInt(year), Integer.parseInt(month)-1, Integer.parseInt(day), Integer.parseInt(hour),
Integer.parseInt(min), Integer.parseInt(sec));
//feed_zeit.set(Calendar.AM,0);
//akt_zeit.set(Calendar.AM,0 );
log("Datum: "+df.format(feed_zeit.getTime())+"\n"+
"Zeit: "+tf.format(feed_zeit.getTime()));
long timediff = akt_zeit.getTimeInMillis() - feed_zeit.getTimeInMillis();
log("Timediff: "+timediff/60000);
long a = timediff/60000;
if(a==0){long secs = timediff/1000; actual_feedtime_string="Vor "+secs+ " Sekunden";}
else if(a>=60&&a<120){long rest = (a%60);
if(rest==1){actual_feedtime_string="Vor "+(a/60)+" Stunde "+rest+" Minute";}
else actual_feedtime_string="Vor "+(a/60)+" Stunde "+rest+" Minuten";}
else if((a>=120)&&(a<=1440)){long rest = (a%60); actual_feedtime_string="Vor "+(a/60)+" Stunden "+rest+" Minuten";}
else if (a>=1440){actual_feedtime_string="Vor "+(a/1440)+" Tag";}
else if (a>=2880){actual_feedtime_string="Vor "+(a/1440)+" Tagen";}
else if(a==1)actual_feedtime_string="vor 1 Minute";
else actual_feedtime_string="vor "+a+" Minuten";
}
public static void log(String string) {
if(Properties.LOGGING_ENABLED)System.out.println(string);
}
public static void log(Integer intstring) {
if(Properties.LOGGING_ENABLED)System.out.println(intstring);
}
}