How to print a user control in PDF instead of xps? - wpf

When I want to print a user control, if I wanted to print to PDF, I have to covert the user control to a bitmap, if not, I get a blank page.
However, if I print to XPS, I get the pages.
Also I have realized this advantages of the XPS format:
It is saved like vectorial objects, so I can zoom all I want I always get the better quality.
If it is text, I can select the text.
The size of the document is lower.
If I use a bitmap, the quality of text is worse, and I can't select it.
This is the code when I print it to PDF:
public static void ImprimirWpfToPdf(IEnumerable<dynamic> paramIeViewsParaImprimir, int paramFactorCalidad)
{
FixedDocument miDocumento = new FixedDocument();
DpiScale miDpiScaleDelSistema = System.Windows.Media.VisualTreeHelper.GetDpi(paramIeViewsParaImprimir.ElementAt(0));
for (int i = 0; i < paramIeViewsParaImprimir.Count(); i++)
{
paramIeViewsParaImprimir.ElementAt(i).Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
paramIeViewsParaImprimir.ElementAt(i).Arrange(new Rect(paramIeViewsParaImprimir.ElementAt(i).DesiredSize));
paramIeViewsParaImprimir.ElementAt(i).UpdateLayout();
Size miTamañoPagina = new Size(paramIeViewsParaImprimir.ElementAt(i).ActualWidth, paramIeViewsParaImprimir.ElementAt(i).ActualHeight);
int miAncho = (int)Math.Round(miTamañoPagina.Width / 2, MidpointRounding.AwayFromZero) * 2;
int miAlto = (int)Math.Round(miTamañoPagina.Height / 2, MidpointRounding.AwayFromZero) * 2;
System.Windows.Media.Imaging.RenderTargetBitmap bitmap = new System.Windows.Media.Imaging
.RenderTargetBitmap(miAncho * paramFactorCalidad, miAlto * paramFactorCalidad, (miDpiScaleDelSistema.PixelsPerInchX / miDpiScaleDelSistema.DpiScaleX) * paramFactorCalidad, (miDpiScaleDelSistema.PixelsPerInchY / miDpiScaleDelSistema.DpiScaleY) * paramFactorCalidad, System.Windows.Media.PixelFormats.Pbgra32);
bitmap.Render(paramIeViewsParaImprimir.ElementAt(i));
System.Windows.Controls.Image myImage = new System.Windows.Controls.Image();
myImage.Source = bitmap;
//Se crea una página del documento. La primera, que tendrá los calendarios.
FixedPage miPagina1 = new FixedPage();
miPagina1.Width = miTamañoPagina.Width;
miPagina1.Height = miTamañoPagina.Height;
miPagina1.Children.Add(bitmap);
PageContent miContenido1 = new PageContent();
((IAddChild)miContenido1).AddChild(miPagina1);
miDocumento.Pages.Add(miContenido1);
}
System.Windows.Controls.PrintDialog myDialog = new System.Windows.Controls.PrintDialog();
if (myDialog.ShowDialog() == true)
{
try
{
//Print the image.
myDialog.PrintDocument(miDocumento.DocumentPaginator, string.Empty);
}
catch
{
//##MEJORAR: realmente una librería nunca debería tener un messagebox. Se tiene que lanzar una excepción.
MessageBox.Show("El documento no se ha podido crear.\r\n\r\n"
+ "Si está abierto y se está intentando sobreescribir, se recomienda cerrar el documento antes"
+ " de imprimirlo.");
}
}
}
This is the code to print in XPS:
public static void ImprimirWpfToXps(IEnumerable<dynamic> paramIeViewsParaImprimir, int paramFactorCalidad)
{
FixedDocument miDocumento = new FixedDocument();
DpiScale miDpiScaleDelSistema = System.Windows.Media.VisualTreeHelper.GetDpi(paramIeViewsParaImprimir.ElementAt(0));
for (int i = 0; i < paramIeViewsParaImprimir.Count(); i++)
{
paramIeViewsParaImprimir.ElementAt(i).Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
paramIeViewsParaImprimir.ElementAt(i).Arrange(new Rect(paramIeViewsParaImprimir.ElementAt(i).DesiredSize));
paramIeViewsParaImprimir.ElementAt(i).UpdateLayout();
Size miTamañoPagina = new Size(paramIeViewsParaImprimir.ElementAt(i).ActualWidth, paramIeViewsParaImprimir.ElementAt(i).ActualHeight);
int miAncho = (int)Math.Round(miTamañoPagina.Width / 2, MidpointRounding.AwayFromZero) * 2;
int miAlto = (int)Math.Round(miTamañoPagina.Height / 2, MidpointRounding.AwayFromZero) * 2;
FixedPage miPagina1 = new FixedPage();
miPagina1.Width = miTamañoPagina.Width;
miPagina1.Height = miTamañoPagina.Height;
miPagina1.Children.Add(paramIeViewsParaImprimir.ElementAt(i));
PageContent miContenido1 = new PageContent();
((IAddChild)miContenido1).AddChild(miPagina1);
miDocumento.Pages.Add(miContenido1);
}
System.Windows.Controls.PrintDialog myDialog = new System.Windows.Controls.PrintDialog();
if (myDialog.ShowDialog() == true)
{
try
{
//Print the image.
myDialog.PrintDocument(miDocumento.DocumentPaginator, string.Empty);
}
catch
{
//##MEJORAR: realmente una librería nunca debería tener un messagebox. Se tiene que lanzar una excepción.
MessageBox.Show("El documento no se ha podido crear.\r\n\r\n"
+ "Si está abierto y se está intentando sobreescribir, se recomienda cerrar el documento antes"
+ " de imprimirlo.");
}
}
}
The unique difference between both is that, in the case of XPS, I don't create the bitmap and I add the user control directly to the fixed page.
This example code also it is needed to setup in windows as default printer, XPS printer or PDF printer in each case, but this has an easy solution.
Well, my question is, if in the XPS method version, if I have selected the Microsoft PDF Printer as default printer I get empty pages and if I print to XPS I get the pages that I want?
Thanks.

Related

SDL SetRenderDrawColor Opacity doesn't work

I have an issue with my code. I don't manage to change the opacity of my RenderDrawColor.
Indeed, I know that SetRenderDrawColor is defined by (renderer, R, G, B, a --> which represents the opacity value). Nevertheless, I tried to change a value but my color doesn't change and I have my rectangle fully fill again.
Here a photo of what I have with my code :
Screen that I have with my code
Here is my code, that I execute with a main.c script :
void display_end_menu(SDL_Renderer *renderer) {
if (SDL_SetRenderDrawColor(renderer, 0, 255, 0, 30) != 0) {
return_error("Impossible de modifier la couleur du render");
SDL_Quit();
}
SDL_Rect shadow_screen;
shadow_screen.w = 1280;
shadow_screen.h = 720;
shadow_screen.x = (SCREEN_WIDTH - shadow_screen.w)/2;
shadow_screen.y = (SCREEN_HEIGHT - shadow_screen.h)/2;
if (SDL_RenderFillRect(renderer, &shadow_screen) != 0) {
return_error("Impossible de dessiner le rectangle dans le render");
SDL_Quit();
}
if (SDL_SetRenderDrawColor(renderer, 255, 255, 255, 30) != 0) {
return_error("Impossible de modifier la couleur du render");
SDL_Quit();
}
SDL_Rect quit_button;
quit_button.w = 200;
quit_button.h = 50;
quit_button.x = (SCREEN_WIDTH - quit_button.w)/2;
quit_button.y = (SCREEN_HEIGHT - quit_button.h)/2;
if (SDL_RenderFillRect(renderer, &quit_button) != 0) {
return_error("Impossible de dessiner le rectangle dans le render");
SDL_Quit();
}
}
I tried several numbers for alpha such as 0, 30 and so on, but it's impossible to edit the opacity of the rectangle.

Problem with duplicate data in fgets with structs [duplicate]

This question already has answers here:
Why is “while( !feof(file) )” always wrong?
(5 answers)
Closed 5 months ago.
I have a program that seems to have a problem displaying the data received from a .txt file with fgets
Basically the program is something similar to a CRUD or ABM (in Spanish).
The problem is that when I show the structs from the file, it shows me a duplicate of the last struct.
The code is the following:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
// ==== Estructura Empleado ====
typedef struct
{
int legajo; // Numero de 6 digitos
char nombreApellido[30];
float sueldo; // Aleatorio entre 80k-200k
} Empleado;
// Carga un empleado por teclado; Devuelve un struct Empleado
Empleado cargarEmpleadoPorTeclado();
// Carga un vector de Empleado
void cargarEmpleadosPorTeclado(Empleado empleados[], int cantidadEmpleados);
// Recibe un vector de chars y devuelve un struct Empleado
Empleado parsearEmpleado(char datosSinParsear[50], int largoDatos);
// Carga los empleados desde el archivo al vector empleados[]
void cargarEmpleadosEnVector(Empleado empleados[], int cantidadEmpleados);
// Guarda los empleados en el archivo 'empleados.txt'
void guardarEmpleados(Empleado empleados[], int cantidadEmpleados);
// Muestra los empleados cargados en el vector empleados[]
void mostrarEmpleadosDesdeArchivo(int cantidadEmpleados, int eliminados);
// Busca un empleado por legajo en el archivo 'empleados.txt' y lo 'elimina'
void eliminarEmpleadoPorLegajo(Empleado empleados[], int legajo, int cantidadEmpleados, int * eliminados);
void eliminarEmpleadoVectorPorLegajo(Empleado empleados[], int legajo, int cantidadEmpleados, int *eliminados);
void menu(Empleado empleados[], int cantidadEmpleados);
/* ==== Funcion main ==== */
int main()
{
int cantidadEmpleados = 100;
Empleado empleados[cantidadEmpleados];
menu(empleados, cantidadEmpleados);
return 0;
}
/* ==== Implementaciones ==== */
Empleado cargarEmpleadoPorTeclado()
{
Empleado empleado;
printf("\nIngrese el Nombre y Apellido del empleado: ");
fflush(stdin);
gets(empleado.nombreApellido);
printf("\nIngrese el numero de Legajo del empleado: ");
fflush(stdin);
scanf("%d", &empleado.legajo);
empleado.sueldo = 80000 + rand() % (200000-80000);
return empleado;
}
void cargarEmpleadosPorTeclado(Empleado empleados[], int cantidadEmpleados)
{
for (int i = 0; i < cantidadEmpleados; i++)
{
empleados[i] = cargarEmpleadoPorTeclado();
}
guardarEmpleados(empleados, cantidadEmpleados);
}
Empleado parsearEmpleado(char datosSinParsear[], int largoDatos)
{
Empleado empleado;
int delimitador1 = -1;
int delimitador2 = -1;
char auxiliarLegajo[10] = " ";
char auxiliarNombreApellido[30] = " ";
char auxiliarSueldo[10] = " ";
for(int i = 0; i < largoDatos; i++)
{
// Recorro el string hasta encontrar la primera ocurrencia
// Notese que i = largoDatos es para forzar la salida del for y no sobreescribir el valor de delimitador1
// con la segunda ocurrencia
if(datosSinParsear[i] == ';')
{
delimitador1 = i;
i = largoDatos;
}
}
// Recorro el string a partir de la posicion siguiente de la primera ocurrencia
for (int i = delimitador1 + 1; i < largoDatos; i++)
{
if (datosSinParsear[i] == ';')
{
delimitador2 = i;
}
}
if ((delimitador1 != -1) && (delimitador2 != -1))
{
// Desde 0 hasta delimitador1 tenemos el legajo
for (int i = 0; i < delimitador1; i++)
{
auxiliarLegajo[i] = datosSinParsear[i];
}
// Desde delimitador1+1 hasta delimitador2 tenemos el nombre y apellido
for (int i = delimitador1 + 1; i < delimitador2; i++)
{
auxiliarNombreApellido[i - delimitador1 - 1] = datosSinParsear[i];
}
// Desde delimitador2+1 hasta largoDatos tenemos el sueldo en float
for (int i = delimitador2 + 1; i < strlen(datosSinParsear); i++)
{
auxiliarSueldo[i - delimitador2 - 1] = datosSinParsear[i];
}
empleado.legajo = atoi(auxiliarLegajo);
strcpy(empleado.nombreApellido, auxiliarNombreApellido);
empleado.sueldo = atof(auxiliarSueldo);
return empleado;
}
}
void cargarEmpleadosEnVector(Empleado empleados[], int cantidadEmpleados)
{
// Intentamos abrir el archivo y verificamos si no es un puntero nulo
FILE * archivoEmpleados = fopen("empleados.txt", "r");
if(archivoEmpleados != NULL)
{
int i = 0;
while (!feof(archivoEmpleados) && (i < cantidadEmpleados))
{
char datosSinParsear[50] = "";
Empleado empleadoActual;
// Leemos los datos y lo parseamos
fgets(datosSinParsear, 50, archivoEmpleados);
empleadoActual = parsearEmpleado(datosSinParsear, 50);
// Lo asignamos a la posicion actual del vector 'empleados[]'
empleados[i] = empleadoActual;
i++;
}
fclose(archivoEmpleados);
}
// Si el archivo no existe o no lo encuentra
else
{
printf("\nImposible leer los empleados\nEl archivo \"empleados.txt\" no existe o no se encuentra en la ruta actual");
exit(-1);
}
}
void guardarEmpleados(Empleado empleados[], int cantidadEmpleados)
{
// Intentamos abrir el archivo y verificamos si no es un puntero nulo
FILE * archivoEmpleados = fopen("empleados.txt", "w");
if(archivoEmpleados != NULL)
{
for (int i = 0; i < cantidadEmpleados; i++)
{
// Grabamos los datos linea por linea con el formato 'legajo;nombreapellido;sueldo'
fprintf(archivoEmpleados, "%d;%s;%.2f\n", empleados[i].legajo, empleados[i].nombreApellido, empleados[i].sueldo);
}
printf("\nEmpleados guardados exitosamente en \"empleados.txt\"");
fclose(archivoEmpleados);
}
// Si el archivo no existe o no lo encuentra
else
{
printf("\nImposible guardar los empleados\nEl archivo \"empleados.txt\" no existe o no se encuentra en la ruta actual");
exit(-1);
}
}
void mostrarEmpleadosDesdeArchivo(int cantidadEmpleados, int eliminados)
{
FILE * archivoEmpleados = fopen("empleados.txt", "r");
int i = 0;
while(!feof(archivoEmpleados) && i < (cantidadEmpleados-eliminados))
{
char datosSinParsear[50] = "";
fgets(datosSinParsear, 50, archivoEmpleados);
Empleado empleadoActual;
empleadoActual = parsearEmpleado(datosSinParsear, 50);
printf("\nEmpleado");
printf("\n\t* Numero de legajo: %d", empleadoActual.legajo);
printf("\n\t* Nombre y Apellido: %s", empleadoActual.nombreApellido);
printf("\n\t* Sueldo (en pesos): %.2f", empleadoActual.sueldo);
i++;
}
fclose(archivoEmpleados);
}
/*
Esta funcion no elimina en si la linea que pertenezca al empleado
Sino mas bien, la omitiria cuando la lea, escribiendo un archivo nuevo con el mismo nombre
De esa forma, estariamos haciendo lo mismo
*/
void eliminarEmpleadoPorLegajo(Empleado empleados[], int legajo, int cantidadEmpleados, int *eliminados)
{
// Intentamos abrir el archivo y verificamos si no es un puntero nulo
FILE * archivoEmpleados = fopen("empleados.txt", "r");
// Creamos un nuevo archivo para escribir los datos
FILE * nuevoArchivoEmpleados = fopen("empleados2.txt", "w");
if(archivoEmpleados != NULL)
{
int i = 0;
while (!feof(archivoEmpleados) && i < cantidadEmpleados)
{
char datosSinParsear[50] = "";
Empleado empleadoActual;
// Recibimos los datos y los parseamos
fgets(datosSinParsear, 50, archivoEmpleados);
empleadoActual = parsearEmpleado(datosSinParsear, 50);
/*
Cuando no coincida el legajo, escribe
Si es que llega a coincidir (justamente ese debemos eliminar), no lo escribimos,
simplemente, hacemos una iteración y continuamos el bucle
*/
if (empleadoActual.legajo != legajo)
{
fprintf(nuevoArchivoEmpleados, "%d;%s;%.2f\n", empleadoActual.legajo, empleadoActual.nombreApellido, empleadoActual.sueldo);
i++;
}
else
{
i++;
continue;
};
}
fclose(archivoEmpleados);
fclose(nuevoArchivoEmpleados);
remove("empleados.txt");
rename("empleados2.txt", "empleados.txt");
eliminarEmpleadoVectorPorLegajo(empleados, legajo, cantidadEmpleados, &eliminados);
*eliminados = *eliminados + 1;
printf("\nEmpleado con legajo numero %d eliminado exitosamente", legajo);
}
// Si el archivo no existe o no lo encuentra
else
{
printf("\nImposible eliminar al empleado\nEl archivo \"empleados.txt\" no existe o no se encuentra en la ruta actual");
exit(-1);
}
}
void eliminarEmpleadoVectorPorLegajo(Empleado empleados[], int legajo, int cantidadEmpleados, int *eliminados)
{
int posicionDelElemento = -1;
for (int i = 0; i < cantidadEmpleados; i++)
{
if(empleados[i].legajo == legajo)
{
posicionDelElemento = i;
i = cantidadEmpleados;
}
}
for(int i = posicionDelElemento - 1; i<cantidadEmpleados-1; i++)
{
empleados[i] = empleados[i + 1];
}
cantidadEmpleados--;
}
void menu(Empleado empleados[], int cantidadEmpleados)
{
int sigue = 1;
int eliminados = 0;
int cantidadEmpleadosVar = 0;
printf("\nMenu Empleados\n");
printf("\nOpciones:\n");
printf("\n\t1. Listar los empleados");
printf("\n\t2. Agregar un empleado");
printf("\n\t3. Eliminar un empleado");
printf("\n\t4. Salir");
do
{
int opcion;
int legajo;
printf("\nIngrese opcion > ");
scanf("%d", &opcion);
switch (opcion)
{
case 1:
printf("\nMostrando empleados cargados");
mostrarEmpleadosDesdeArchivo(cantidadEmpleados, eliminados);
break;
case 2:
printf("\nAgregar un empleado:");
printf("\nCuantos empleados desea cargar? > ");
scanf("%d", &cantidadEmpleadosVar);
cargarEmpleadosPorTeclado(empleados, cantidadEmpleadosVar);
break;
case 3:
printf("\nEliminando un empleado:");
printf("\nIngrese el numero de legajo del empleado a eliminar > ");
scanf("%d", &legajo);
eliminarEmpleadoPorLegajo(empleados, legajo, cantidadEmpleados, &eliminados);
break;
case 4:
sigue = 0;
break;
default:
printf("\nLa opcion \"%d\" no es valida, ingrese otra vez\n\n", opcion);
continue;
break;
}
} while (sigue);
}
And the empleados.txt file is the following:
555666;Leandro;80041.00
232433;Juan;80945.00
234443;Antonio;90485.00
119304;Manuel;102943.00
The output is:
Code output linked on imgur
Does anyone know what this error could be?
There are many issues in your code, here are some important ones:
you must not use gets(): read Why is the gets function so dangerous that it should not be used?
you should test the return value of fgets() to determine if a line was read or if end of file has been reached.
using feof() for this purpose as you do is incorrect. You should read Why is “while( !feof(file) )” always wrong?
you should always test for fopen() success before calling any stream function with the FILE pointer.
Also use more spaces for indentation, 4 is recommended for readability.

i want to Print the minimum road data

I want to print the mininum road but I don't know which variable I have to select, can somebody help me?
The code is in Spanish.
int algoritmo(const int begin, const int end, const Graph graph)
{
priority_queue<State> pq; // La cola de prioridad.
vector<int> Dist(graph.V, oo); // La distancia hacia todos los vertices. Inicialmente para cada vertice su valor es infinito.
vector<bool> mark(graph.V, false); // Este arreglo nos permitira determinar los nodos procesados.
Dist[begin] = 0; // Valor inicial del vertice de partida.
pq.push(State(begin, 0)); // Agregamos el primer elemento, que no es mas que el vertice de partida.
while(!pq.empty()) // Mientras existan vertices por procesar.
{
State st = pq.top(); pq.pop(); // Se desencola el elemento minimo.
mark[st.node] = true;// Se marca el nodo como visitado.
if (st.node == end)
return st.cost; // Retornamos el valor del camino, hemos llegado al vertice destino.
int T = (int)graph.G[st.node].size();
for(int i = 0; i < T; ++i) // Se recorren las adyacencias de "a".
{
// Si no ha sido procesado el vertice "vi" y la distancia hacia "vi" es menor a la distancia
// en Dist entonces hemos encontrado un camino mas corto a "vi".
if (!mark[graph.G[st.node][i].node] && ((Dist[st.node] + graph.G[st.node][i].cost) < Dist[graph.G[st.node][i].node]))
{
Dist[graph.G[st.node][i].node] = st.cost + graph.G[st.node][i].cost;
pq.push(State(graph.G[st.node][i].node, st.cost + graph.G[st.node][i].cost));
}
}
//cout<<st.node<<endl;
}
return -1; // Si no se puede llegar al destino, retornar -1.
}

VGA Programming in C: Drawing pixel on mouse click

I´m working on a small Microsoft paint-like program to learng VGA 256 color programming on C.
I have been able to plot a pixel when the user clicks on the screen and keep ploting the pixels while the mouse button is pressed. However if I move the mouse fast across the screen, I don´t get a continous line. Instead I get this result
How can I make the line be continous even when there are fast mouse movements?
Heres the code I have until now:
/**************************************************************************
* paint_screen *
* show main screen paint *
**************************************************************************/
void paint_screen(BITMAP *fondo){
int mantenido;
BITMAP barra,barra_color,normal_ptr_image;
int anterior_presionado;
word last_time;
word redraw,press,release;
sword dx,dy=0;
MOUSEBITMAP *mouse_new=NULL;
int i,done = 0;
accion =1;
/*Pintando fondo blanco*/
clear_screen();
/*Pintando barra de herramientas*/
load_bmp("normal.bmp",&normal_ptr_image);
load_bmp("mainbar.bmp",&barra);
load_bmp("colores.bmp",&barra_color);
set_pallete(fondo->pallete);
draw_bitmap(&barra,0,0);
draw_bitmap(&barra_color,0,180);
load_mouse(&mouse_g);
show_mouse(&mouse_g);
wait(50);
while(!done){
do { // check mouse status
anterior_presionado = press;
get_mouse_motion(&dx,&dy);
press = get_mouse_press(LEFT_BUTTON);
release = get_mouse_release(LEFT_BUTTON);
//Si el estado estaba presionado y no se ha soltado.. el boton esta mantenido
if(anterior_presionado==1 &&release==0){
mantenido =1;
}
} while (dx==0 && dy==0 && press==0 && release==0&&*my_clock==last_time);
if (release){
mouse_g.button1=0;
mantenido=0;
boton_soltado();
}
if (press){
mouse_g.button1=1;
boton_presionado();
}
//El boton se mantiene presionado
else if(mantenido){
boton_mantenido();
}
else{
release=1;
}
if (dx || dy) // calculate movement
{
new_x1 = mouse_g.x+dx;
new_y1 = mouse_g.y+dy; //Actualizamos posicion mouse
if (new_x1<0) new_x1=0;
if (new_y1<0) new_y1=0;
if (new_x1>319) new_x1=319;
if (new_y1>199) new_y1=199;
redraw=1;
}
if(redraw){
wait_for_retrace();
hide_mouse(&mouse_g);
if (mouse_new!=NULL) mouse_g.bmp=mouse_new;
mouse_g.x = new_x1;
mouse_g.y=new_y1;
show_mouse(&mouse_g);
redraw=0;
mouse_new=NULL;
}
if(new_x1>=287 && new_x1 <320
&& new_y1>=180 && new_y1 < 200 &&press){
set_mode(TEXT_MODE);
printf("Adios!!");
wait(25);
done=0;
return;
}
}
}
void realizar_accion(){
/*Caso1: Pintar pixel simple (lapiz)*/
if(accion==1){
plot_pixel(mouse_g.x,mouse_g.y,2);
plot_pixel(mouse_g.x-1,mouse_g.y,2);
plot_pixel(mouse_g.x,mouse_g.y-1,2);
plot_pixel(mouse_g.x-1,mouse_g.y-1,2);
}
}
void realizar_accion_mantenido(){
if(accion==1){
plot_pixel(mouse_g.x,mouse_g.y,2);
plot_pixel(mouse_g.x-1,mouse_g.y,2);
plot_pixel(mouse_g.x,mouse_g.y-1,2);
plot_pixel(mouse_g.x-1,mouse_g.y-1,2);
}
}
int sobre_barra(){
if(new_x1>0 && new_x1<33 &&new_y1>0 &&new_y1<181){
return 1;
}
else{
return -1;
}
}
void boton_mantenido(){
/*Verificar que este dento del buffer de dibujo....*/
if(sobre_barra()!=1){
realizar_accion_mantenido();
}
}
void boton_presionado(){
if(sobre_barra()==1){
cambiar_herramienta();
}
else{
realizar_accion();
}
}

Print txt. file using JOptionpane

I created a txt. file (vector [14]) , it's a list of 14 countries that I need to print (all of them) using JOptionPane or similiar, but all appers to me is the first country. Someone can help me please?
public static void main (String [] args) throws IOException {
int cont=0;
BufferedReader fr= new BufferedReader (new FileReader("paises.txt")) ;
String destino= JOptionPane.showInputDialog("Digite o seu país de destino:");
String busca = destino;
try {
while (fr.ready()) {
String linha= fr.readLine();
if(linha.equals(busca)) {
cont =1;
}
}
fr.close();
if (cont==1) {
JOptionPane.showMessageDialog(null,"OK!","Opção Destinos",JOptionPane.INFORMATION_MESSAGE) ;
} else {
int res =JOptionPane.showConfirmDialog(null,"Destino não encontrado, gostaria de visualizar todos os países que fazem parte da nossa rota?","Ops!!",JOptionPane.YES_NO_CANCEL_OPTION);
if (res==JOptionPane.YES_OPTION) {
Scanner inFile = new Scanner(new FileReader("paises.txt"));
String pp = inFile.nextLine();
JOptionPane.showMessageDialog(null,pp, "Próxima Parada", JOptionPane.INFORMATION_MESSAGE);
}
}
}
catch (Exception e) {
System.out.println ("ERRO");
}
}
}

Resources